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
删除正在使用的镜像会报错,优雅的删除镜像分为三步:
- 停止使用镜像的容器
docker stop [CONTAINER ID]
,可以通过docker ps -a
查询。 - 删除容器
docker rm [CONTAINER ID]
。 - 删除镜像
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