Docker


Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

安装

Ubuntu 18.04 安装 Docker, 使用官方安装脚本自动安装

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

也可以使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

容器使用

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法

启动容器

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
$ docker run --name mynginx -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
$ docker run -p 80:80 -v /data:/data -d nginx:latest
# 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
$ docker run -it nginx:latest /bin/bash
# 在启动容器时映射一个卷到容器中:
$ sudo docker run -it --rm -v ~/DBC-AIComputingNet:/home/deepbrainchain jerry/ubuntu:dbc-compile /bin/bash
将宿主机的~/DBC-AIComputingNet映射到容器中/home/deepbrainchain
在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。
但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统。
执行docker run命令带--rm命令选项,等价于在容器退出后,执行docker rm -v。

查询容器

$ docker ps
$ docker ps -a
# 查询某个容器的端口映射
$ docker port <CONTAINER ID>

容器统计数据

docker stats [OPTIONS] [CONTAINER...]
OPTIONS 说明:
  --all , -a :显示所有的容器,包括未运行的。
  --format :指定返回值的模板文件。
  --no-stream :展示当前状态就直接退出了,不再实时更新。
  --no-trunc :不截断输出。
# 列出所有在运行的容器信息。
$ docker stats
CONTAINER ID        NAME                                    CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
b95a83497c91        awesome_brattain                        0.28%               5.629MiB / 1.952GiB   0.28%               916B / 0B           147kB / 0B          9
67b2525d8ad1        foobar                                  0.00%               1.727MiB / 1.952GiB   0.09%               2.48kB / 0B         4.11MB / 0B         2
e5c383697914        test-1951.1.kay7x1lh1twk9c0oig50sd5tr   0.00%               196KiB / 1.952GiB     0.01%               71.2kB / 0B         770kB / 0B          1
4bda148efbc0        random.1.vnc8on831idyr42slu578u3cr      0.00%               1.672MiB / 1.952GiB   0.08%               110kB / 0B          578kB / 0B          2
# 根据容器等 ID 或名称显示信息
$ docker stats awesome_brattain 67b2525d8ad1
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
b95a83497c91        awesome_brattain    0.28%               5.629MiB / 1.952GiB   0.28%               916B / 0B           147kB / 0B          9
67b2525d8ad1        foobar              0.00%               1.727MiB / 1.952GiB   0.09%               2.48kB / 0B         4.11MB / 0B         2
# 以 JSON 格式输出:
$ docker stats nginx --no-stream --format "{{ json . }}"
  {"BlockIO":"0B / 13.3kB","CPUPerc":"0.03%","Container":"nginx","ID":"ed37317fbf42","MemPerc":"0.24%","MemUsage":"2.352MiB / 982.5MiB","Name":"nginx","NetIO":"539kB / 606kB","PIDs":"2"}

启动已停止的容器

$ docker start <CONTAINER ID>

停止容器

$ docker stop <CONTAINER ID>

重启容器

$ docker restart <CONTAINER ID>

连接容器

在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:

  • docker attach: 使用此命令进入容器,再次退出时会停止容器。
  • docker exec: 推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
$ docker attach <CONTAINER ID>
$ docker exec <CONTAINER ID>

导入导出容器

# 导出容器 1e560fca3906 (使用 docker ps 查询) 快照到本地文件 ubuntu.tar
$ docker export 1e560fca3906 > ./ubuntu.tar
# 使用 docker import 将容器快照文件 ubuntu.tar 导入为镜像 test/ubuntu:v1
$ cat ./ubuntu.tar | docker import - test/ubuntu:v1
# 此外,也可以通过指定 URL 或者某个目录来导入
$ docker import http://example.com/exampleimage.tgz example/imagerepo
$ docker images

删除容器

$ docker rm <CONTAINER ID>
$ docker rm -f <CONTAINER ID>
# 下面的命令可以清理掉所有处于终止状态的容器。
$ docker container prune

拷贝文件

在客户机和容器之间拷贝文件:

$ docker cp 源文件地址 目标文件夹
$ sudo docker cp 3754e2278fa4:/home/deepbrainchain/output/dbc /home/cuijg/pack/

镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

列出所有镜像

runoob@runoob:~$ docker images           
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
training/webapp     latest              6fae60ef3446        11 months ago       348.8 MB

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:

$ docker run -t -i ubuntu:15.10 /bin/bash 

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

$ sudo docker search httpd
NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                The Apache HTTP Server Project                  4331      [OK]       
clearlinux/httpd                     httpd HyperText Transfer Protocol (HTTP) ser…   2                    
avenga/httpd-static                                                                  0                    
betterweb/httpd                                                                      0                    
centos/httpd-24-centos7              Platform for running Apache httpd 2.4 or bui…   45                   
manageiq/httpd                       Container with httpd, built on CentOS for Ma…   1                    [OK]
centos/httpd-24-centos8                                                              1                    
dockerpinata/httpd                                                                   1                    
19022021/httpd-connection_test       This httpd image will test the connectivity …   0                    
paketobuildpacks/httpd                                                               0                    
centos/httpd                                                                         36                   [OK]
publici/httpd                        httpd:latest                                    1                    [OK]

拉取镜像

我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。

$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8b87079b7a06: Pulling fs layer 
a3ed95caeb02: Download complete 
0d62ec9c6a76: Download complete 
a329d50397b9: Download complete 
ea7c1f032b5c: Waiting 
be44112b72c7: Waiting

下载完成后,我们就可以使用这个镜像了。

推送镜像

将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参考下面的将镜像推送到阿里云。

删除镜像

镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:

$ sudo docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:aa0cc8055b82dc2509bed2e19b275c8f463506616377219d9642221ab53cf9fe
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

删除正在使用的镜像会报错,优雅的删除镜像分为三步:

  1. 停止使用镜像的容器 docker stop [CONTAINER ID],可以通过 docker ps -a 查询。
  2. 删除容器 docker rm [CONTAINER ID]
  3. 删除镜像 docker rmi [IMAGE ID],可以通过 docker images 查询。

使用容器创建一个新镜像

使用 docker run 启动一个容器,运行一些命令或者修改后,可以将修改后的容器保存为新的镜像,并添加提交人信息和说明信息。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
  -a :提交的镜像作者;
  -c :使用Dockerfile指令来创建镜像;
  -m :提交时的说明文字;
  -p :在commit时,将容器暂停。
# 将容器 a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。
$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1 
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
$ docker images mymysql:v1
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mymysql             v1                  37af1236adef        15 seconds ago      329 MB
$ sudo docker commit -m "ubuntu-dev" -a "jerry" b8b1b3da0fea jerry/ubuntu:dev
参数解释如下:
 -m: 提交的描述信息
 -a: 指定镜像作者
 1683ab3e55f0:需要保存的容器 ID,通过sudo docker ps查看第一列
 shichao/ubuntu:v1: 指定要创建的目标镜像名,冒号前面代表存储库,后面代表标记TAG
注意:保存镜像:在保存镜像前保证容器不退出
用新镜像启动一个容器
$ sudo docker run -it jerry/ubuntu:dev /bin/bash

制作镜像并上传到阿里云

创建阿里云账号,搜索"容器镜像服务",进入容器镜像服务控制台。 此处需要单独设置容器镜像服务的密码: RtGc5sC9

选择个人实例,创建命名空间和镜像仓库。

还需要绑定代码仓库,此处使用阿里云的 Codeup 代码平台,生成授权第三方访问的令牌。 为需要访问 Codeup 的应用程序生成个人访问令牌(Personal Access Token): agp_3a57b771cf07bedf285aaf1665385254

# local host
$ sudo docker pull ubuntu:18.04
$ sudo docker run -it ubuntu:18.04 /bin/bash
# 容器内命令
$ echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
$ echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
$ echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
$ echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
$ apt clean
$ apt update
$ apt install -y vim wget
$ wget https://apt.kitware.com/kitware-archive.sh
$ bash kitware-archive.sh
$ apt install cmake
$ apt install -y build-essential uuid-dev libssl-dev libvirt-dev
# local host
$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS             PORTS     NAMES
9eceaca0f7aa   ubuntu:18.04   "/bin/bash"   About an hour ago   Up About an hour             gracious_curie
$ sudo docker commit -m "ubuntu 18.04 for compiling dbc" -a "jerry" 9eceaca0f7aa dbc:0.1
$ sudo docker images
REPOSITORY                                       TAG       IMAGE ID       CREATED         SIZE
dbc                                              0.1       652c9a351f80   2 minutes ago   490MB
ubuntu                                           18.04     5d2df19066ac   2 weeks ago     63.1MB
hello-world                                      latest    feb5d9fea6a5   16 months ago   13.3kB
$ sudo docker tag 652c9a351f80 registry.cn-shanghai.aliyuncs.com/jerry_se/dbc:0.1
$ sudo docker images
REPOSITORY                                       TAG       IMAGE ID       CREATED         SIZE
dbc                                              0.1       652c9a351f80   2 minutes ago   490MB
registry.cn-shanghai.aliyuncs.com/jerry_se/dbc   0.1       652c9a351f80   2 minutes ago   490MB
ubuntu                                           18.04     5d2df19066ac   2 weeks ago     63.1MB
hello-world                                      latest    feb5d9fea6a5   16 months ago   13.3kB
$ sudo docker login --username=jerry_se registry.cn-shanghai.aliyuncs.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
$ sudo docker push registry.cn-shanghai.aliyuncs.com/jerry_se/dbc:0.1
The push refers to repository [registry.cn-shanghai.aliyuncs.com/jerry_se/dbc]
417e54fb9fc5: Pushed 
475a54c2a93d: Pushed 
0.1: digest: sha256:103fbc726876c7ac475ba7aa4ddc06ad45e9e5b1b238e5c771d24e2a79bdc821 size: 742

# other host
$ sudo docker login --username=jerry_se registry.cn-shanghai.aliyuncs.com
$ sudo docker pull registry.cn-shanghai.aliyuncs.com/jerry_se/dbc:0.1
ubuntu 18.04 阿里云的更新源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

# deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

参考资料