Docker 常用命令整理

Docker 常用命令整理

IT, 其他

整理一下Docker常用的命令

docker-logo

 

镜像(Images)

获取镜像

docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

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

运行镜像

docker run -it --rm ubuntu:14.04 bash

docker run 就是使用镜像为基础启动一个容器的命令,参数的意义如下:
-it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
–rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 –rm 可以避免浪费空间。
ubuntu:14.04 :这是指用 ubuntu:14.04 镜像为基础来启动容器。
bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。

列出镜像

docker images

-a 此参数会显示出所有的镜像,包括中间层镜像
-q 此参数将只显示image的ID
-f –filter 这个参数可以指定显示的镜像类型,例如docker images -f since=mongo:3.2则显示在mongo:3.2后建立的镜像
-format 这个参数可以按照自己想要的格式输出镜像信息。参照Go语言模板语法就可以生成自己想要的列表

创建镜像

sudo docker commit -m "提交信息" -a "用户信息" [容器ID] [标签]

例如:

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

保存和加载镜像

保存镜像

sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

加载镜像

sudo docker load --input ubuntu_14.04.tar

sudo docker load < ubuntu_14.04.tar

 

移除本地镜像

docker rmi

Tips:清理所有未打过标签的本地镜像

sudo docker rmi $(docker images -q -f "dangling=true")

 

 

容器(Container)

新建并启动容器

$ sudo docker run -t -i --rm ubuntu:14.04 /bin/bash

-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上;
-i 则让容器的标准输入保持打开;
–rm 表示容器运行完成立即销毁。

启动已终止容器

docker start <Container>

后台(background)运行

$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

如果使用了 -d 参数运行容器。此时容器会在后台运行并不会把输出的结果(STDOUT)打印到宿主机上面(输出结果可以用docker logs 查看)。
注: 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。
使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker ps 命令来查看容器信息

终止容器

docker stop <Container>

处于终止状态的容器,可以通过 docker start 命令来重新启动。
此外, docker restart 命令会将一个运行态的容器终止,然后再重新启动它。

进入容器

对于进入后台运行的容器可以用两种方式进入:

1.attach

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17seconds nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#

但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

2.nsenter

首先找到容器的第一个进程PID

PID=$(docker inspect --format "{{ .State.Pid }}" <container>)

通过这个 PID,就可以连接到这个容器:

$ nsenter --target $PID --mount --uts --ipc --net --pid
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17seconds nostalgic_hypatia
$ PID=$(docker-pid 243c32535da7)
10981
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#

导出和导入容器

导出容器

通过 docker export 命令。

$ sudo docker export 7691a814370e > ubuntu.tar

导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像

$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3MB

此外,也可以通过指定 URL 或者某个目录来导入,例如

$sudo docker import http://example.com/exampleimage.tgz example/imagerepo

 

仓库

通过docker search可以搜索镜像

sudo docker search centos
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                                 The official build of CentOS.                   2860      [OK]       
jdeathe/centos-ssh                     CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8...   47                   [OK]
nimmis/java-centos                     This is docker images of CentOS 7 with dif...   18                   [OK]
gluster/gluster-centos                 Official GlusterFS Image [ CentOS-7 +  Glu...   14                   [OK]
million12/centos-supervisor            Base CentOS-7 with supervisord launcher, h...   12                   [OK]
torusware/speedus-centos               Always updated official CentOS docker imag...   8                    [OK]
egyptianbman/docker-centos-nginx-php   A simple and highly configurable docker co...   6                    [OK]
nathonfowlie/centos-jre                Latest CentOS image with the JRE pre-insta...   5                    [OK]
centos/mariadb55-centos7                                                               3                    [OK]
...

Docker 数据管理

数据卷(Data volumes)

创建一个数据卷

docker run使用-v参数创建并且挂载数据卷到容器中。一次docker run可以挂载多个数据卷
创建一个名为 web 的容器,并加载一个数据卷到容器的 /webapp 目录。

$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py

查看数据卷的具体信息

$ sudo docker inspect web

在输出的内容中找到其中和数据卷相关的部分,可以看到所有的数据卷都是创建在主机的 /var/lib/docker/volumes/ 下面的

"Mounts": [
            {
                "Name": "3274d36dddf9a47468e2c90283d2ff6caa405b69e13dff776a11c7cfab66d30b",
                "Source": "/var/lib/docker/volumes/3274d36dddf9a47468e2c90283d2ff6caa405b69e13dff776a11c7cfab66d30b/_data",
                "Destination": "/webapp",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

删除数据卷

数据卷的生命周期是独立于容器的,就算删除容器也不会自动删除数据卷,同时,无主(容器被删除)的数据卷会占用很大空间,且清理比较麻烦。因此如果要移除数据卷,应该在停止当前容器之后,删除容器之前。
注:docker volume ls可以用来列出主机上剩余的数据卷,docker volume rm 可以删除数据卷

docker rm -v <Container>

挂载一个主机目录作为数据卷

使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp 目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

挂载一个本地主机文件作为数据卷

$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

数据卷容器(Data volume containers)

如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

1.创建数据卷容器

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

2.调用数据卷

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

–volumes-from可以使用多次来指定从多个容器挂载不同的数据卷,同时可以从已经挂载数据卷的容器中级联挂载数据卷。

利用数据卷容器来备份、恢复、迁移数据卷

备份

首先使用 –volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

容器启动后,使用了 tar 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar 的文件。
注:虽然其实这里是将容器中/dbdata挂载点映射到了主机/var/lib/docker/volumes/路径下,但是按照docker的思路,仍然应该通过容器对数据卷进行操作。

恢复

如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。

$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。

$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

Docker网络

外部访问容器

当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口

$ sudo docker run -d -P training/webapp python app.py
$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1f765f8facca        training/webapp     "python app.py"     18 seconds ago      Up 17 seconds       0.0.0.0:32768->5000/tcp   amazing_ardinghelli

-p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort

映射所有接口地址

使用 hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

映射到指定地址的指定端口

可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

映射到指定地址的任意端口

使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。

$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以使用 udp 标记来指定 udp 端口

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

查看映射端口配置

使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

$ docker port nostalgic_morse 5000
127.0.0.1:49155.

-p 标记可以使用多次来绑定多个端口

Source:https://www.gitbook.com/book/yeasy/docker_practice/details

Amefs, IT, Linux
上一篇文章
排球少年 第一季 BDRip 制作感受
下一篇文章
l-smash GUI

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Fill out this field
Fill out this field
请输入有效的邮箱地址。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

keyboard_arrow_up