Docker 镜像使用

Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会从镜像仓库下载该镜像。

列出镜像列表

  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. iec latest 5bbddd8a8f04 6 days ago 1.23GB
  4. tensorflow/tensorflow latest-py3 e8128de79386 8 weeks ago 1.11GB
  5. python latest 2cc378c061f7 6 months ago 923MB

更细节的显示可以使用docker image ls --format "{{.ID}}: {{.Repository}}"直接列出镜像ID和仓库名,或者使用docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" 以表格等距显示.

查找镜像

  • 我们可以登录Docker Hub网站来搜索镜像.

  • 也可以使用 docker search 命令来搜索镜像,搜索之后,可以pull我们需要的镜像到本地。
    eg:

    1. $ docker search ubuntu
    2. NAME DESCRIPTION STARS OFFICIAL AUTOMA
    3. TED
    4. ubuntu Ubuntu is a Debian-based Linux operating sys 9447 [OK]
    5. dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface 293 [OK]
    6. rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi 212 [OK]
    7. ...

获取镜像

从Docker镜像仓库获取镜像的命令是docker pull。其命令格式为:

  1. docker pull [选项][Docker Registry 地址[:端口号]/] 仓库名[:标签]

具体的选项可以通过docker pull —help命令看到,这里我们说一下镜像名称的格式。

  • Docker镜像仓库地址:地址的格式一般是<域名/IP>[:端口号],默认地址是Docker Hub。
  • 仓库名:如之前所说,这里的仓库名是两段式名称,即<用户名>/<软件名>。对于Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。

eg:

  1. # 不指定Docker仓库会从Docker Hubz直接获取最新镜像
  2. $ docker pull ubuntu
  3. Using default tag: latest
  4. latest: Pulling from library/ubuntu
  5. 898c46f3b1a1: Pull complete
  6. 63366dfa0a50: Pull complete
  7. 041d4cd74a92: Pull complete
  8. 6e1bee0f8701: Pull complete
  9. Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
  10. Status: Downloaded newer image for ubuntu:latest

删除本地镜像

如果要删除本地的镜像,可以使用docker image rm命令,不要过先确保没有容器在使用这个镜像,其格式为:

  1. # 其中,<镜像>可以是镜像短ID、镜像长ID、镜像名或者镜像摘要。
  2. docker image rm [选项] <镜像1> [<镜像2> ...]

运行-Container

有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。

Docker容器使用

启动容器

以上面的ubuntu为例,如果我们打算启动里面的bash并且进行交互式操作的话,可以执行下面的命令。

  1. $ docker run -it --rm -p 5000:5000 \
  2. ubuntu:latest \
  3. bash
  4. root@c94c6b39d067:/# cat /etc/os-release
  5. NAME="Ubuntu"
  6. VERSION="18.04.2 LTS (Bionic Beaver)"
  7. ID=ubuntu
  8. ID_LIKE=debian
  9. PRETTY_NAME="Ubuntu 18.04.2 LTS"
  10. VERSION_ID="18.04"
  11. HOME_URL="https://www.ubuntu.com/"
  12. SUPPORT_URL="https://help.ubuntu.com/"
  13. BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
  14. PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
  15. VERSION_CODENAME=bionic
  16. UBUNTU_CODENAME=bionic
  • -it:这是两个参数,一个是-i:交互式操作,一个是t终端。我们这里打算进入bash执行一些命令并查看返回结果,因此我们需要交互式终端。

  • —rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容 器并不会立即删除,除非手动docker rm。使用 —rm可以避免浪费空间。

  • -p:通过 -p 参数来设置不一样的端口,上面我们设置容器端口5000映射到宿主机端口号5000

查看容器

  1. # docker ps查看正在运行的容器,docker ps -a 查看所有存在的容器包括停止的
  2. $ docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 7b715223170c python "python3" 4 months ago Up 4 months hardcore_agnesi

容器日志查看

为了获取容器的日志信息,可以使用docker logs命令

  1. docker logs [NAME]/[CONTAINER ID]

容器详细信息

docker提供了一个docker inspect命令,该命令会返回容器的详细配置信息。包括:名称、命令、运行状态、网络配置等。

  1. docker inspect [NAME]/[CONTAINER ID]

开启容器

通过docker start来启动之前已经停止的容器

  1. docker start [NAME]/[CONTAINER ID]

停止容器

  1. # 将容器退出
  2. docker stop [NAME]/[CONTAINER ID]
  3. # 强制停止一个容器
  4. docker kill [NAME]/[CONTAINER ID]

删除容器

容器终止后,在需要的时候可以重新启动,确定不需要了,可以进行删除操作。

  1. # 不能删除一个正在运行的容器,会报错,需要先停止容器。
  2. docker rm [NAME]/[CONTAINER ID]

网络-Network

随着Docker网络的完善,为了方便容器间通讯,将容器加入自定义的Docker网络来连接多个容器。

Docker-network使用

新建网络

  1. >
  2. docker network create -d bridge my-net

连接容器

  1. # 运行一个容器并连接到新建的`my-net`网络
  2. docker run -it --rm --name busybox1 --network my-net busybox sh
  3. # 再运行一个容器并加入到my-net网络
  4. docker run -it --rm --name busybox2 --network my-net busybox sh

下面通过ping来证明busybox1容器和busybox2容器建立了互联关系。

  1. # 在busybox1容器输入以下命令
  2. $ ping busybox2
  3. PING busybox2 (172.19.0.3): 56 data bytes
  4. 64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
  5. 64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms

由此,busybox1容器和busybox2容器建立了互联关系。

存储-Volume

数据卷 是一个可供一个或多个容器使用的特殊目录,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用

  • 对数据卷的修改会立马生效

  • 对数据卷的更新,不会影响镜像

  • 数据卷默认会一直存在,即使容器被删除

注意:数据卷 的使用,类似于 Linux 下对目录或文件进行mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

数据卷使用

创建数据卷

  1. >
  2. docker volume create my-vol

查看数据卷

  1. $ docker volume ls
  2. my-vol

查看数据卷信息

  1. $ docker volume inspect my-vol
  2. [
  3. {
  4. "Driver": "local",
  5. "Labels": {},
  6. "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
  7. "Name": "my-vol",
  8. "Options": {},
  9. "Scope": "local"
  10. }
  11. ]

使用数据卷的容器

在用 docker run 的时候,增加 --mount 参数来使用数据卷,以启动redis为例,这里我们启动redis并且开启aof持久化:

  1. docker run -d \
  2. --name redis \
  3. --mount source=my-vol,target=/data \
  4. # -v my-vol:/data \
  5. redis \
  6. redis-server --appendonly yes

在这里redis产生的数据(/data目录下)被挂载到数据卷my-vol中。

我们也可以使用-v或者--volume语法,但是官方建议尽量使用--mount

同样使用inspect语法,我们可以查看redis容器的信息:

  1. docker inspect redis
  2. # 会看到类似如下内容
  3. "Mounts": [
  4. {
  5. "Type": "volume",
  6. "Name": "my-vol",
  7. "Source": "/var/lib/docker/volumes/my-vol/_data",
  8. "Destination": "/data",
  9. "Driver": "local",
  10. "Mode": "",
  11. "RW": true,
  12. "Propagation": ""
  13. }
  14. ],

删除数据卷

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用docker rm -v这个命令。

  1. >
  2. docker volume rm my-vol