45. docker¶
操作系统级别的虚拟化技术,用于实现应用的快速自动化部署。 [3]
45.1. docker安装¶
按照官网提供的安装办法,在centos上 [1]
# Use the following command to set up the stable repository.
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install containerd.io docker-ce docker-ce-cli
sudo systemctl start docker
sudo docker run hello-world
docker service文件的地址是: /usr/lib/systemd/system/docker.service
45.2. docker常用命令¶
完整的文档在 docker run reference [2]
docker run -it ubuntu bash #前台运行容器并且进入, 只有一个进程bash
exit #退出bash, 容器停止运行。 可以使用如下命令
ctrl + p + q #退出容器,bash不退出, 容器继续运行
docker exec -it 35dfs bash #进入已经在运行程序,启动一个bash进程,这个时候系统一共有两个bash
exit #退出bash,因为还有一个bash已经在运行,所以容器不会停止运行。
sudo usermod -a -G docker user1 #把user1添加到docker组中, 这样就可以执行docker命令时不需要sudo了。docker以root权限运行
sudo systemctl enable docker #开机自启动
docker start {ID} #重新启动停止的容器
docker run -i #interative 交互式应用
-t #tty 虚拟终端
--name webserver #指定容器名字
--rm #容器停止后自动删除容器
-d #以detach方式,也就是分离方式连接终端,以便在关闭终端时不影响容器的运行。
-P 80 #不带参数,发布所有容器内的端口到主机随机端口,使用docker port CONTAINER 可以查询。
-p 8888:80 #8888:88 主机的8888端口为容器88端口的映射。
-v %PWD/web:/var/www/html/web:ro #指定本地主机路径%PWD/web映射到目的路径/var/www/html/web
--restart=always #无论退出代码是什么,自动重启
--restart=on-failure:5 #失败时重启,最多重启5次
docker inspect ubuntu #查看容器运行的信息
docker inspect --format='{{.State.Running}}' ubuntu #格式化查询
docker history e5c51ef702d4 #查看docker 镜像的构建历史
docker port 774b2f613874 #显示容器端口->主机端口
docker save -o /home/my/myfile.tar centos:16 #保存镜像到文件
docker load -i myfile.tar #导入镜像
删除停止的容器
docker rm $(docker ps -a -q -f status=exited)
docker container prune
警告
容器无法联网怎么办,考虑添加NAT, 参考理解 veth
iptables -t nat -A POSTROUTING -o eno3 -s 172.17.0.0/16 -j MASQUERADE
45.4. Dockerfile proxy config¶
dockerfile 中一些安装软件包的命令有可能需要使用proxy
ENV HTTP_PROXY "socks5://192.168.1.201:2044"
ENV HTTPS_PROXY "socks5://192.168.1.201:2044"
ENV FTP_PROXY "socks5://192.168.1.201:2044"
ENV NO_PROXY "localhost,127.0.0.0/8,172.17.0.2/8"
45.5. 问题记录¶
45.5.1. docker ps Got permission denied¶
[user1@centos leetcode]$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied
[user1@centos leetcode]$ sudo usermod -aG docker $USER
[user1@centos leetcode]$
45.5.2. CentOS 8 none of the providers can be installed¶
[root@ref-controller ~]# sudo yum install containerd.io docker-ce docker-ce-cli
Last metadata expiration check: 0:04:44 ago on Wed 25 Mar 2020 09:45:26 AM CST.
Error:
Problem: package docker-ce-3:19.03.8-3.el7.aarch64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
- cannot install the best candidate for the job
- package containerd.io-1.2.10-3.2.el7.aarch64 is excluded
- package containerd.io-1.2.13-3.1.el7.aarch64 is excluded
- package containerd.io-1.2.2-3.3.el7.aarch64 is excluded
- package containerd.io-1.2.2-3.el7.aarch64 is excluded
- package containerd.io-1.2.4-3.1.el7.aarch64 is excluded
- package containerd.io-1.2.5-3.1.el7.aarch64 is excluded
- package containerd.io-1.2.6-3.3.el7.aarch64 is excluded
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
其实软件源里面有containerd.io-1.2.6-3.3.el7.aarch64,但是为什么提示被排除,有可能是没有为8版本设置软件源的原因。
解决办法:
yum install -y https://download.docker.com/linux/centos/7/aarch64/stable/Packages/containerd.io-1.2.6-3.3.el7.aarch64.rpm
45.5.3. standard_init_linux.go:190: exec user process caused “exec format error”¶
似乎时一个普遍问题 [4]
Removing intermediate container fe1c9196349d
---> e18ce876e1c4
Step 25/38 : FROM builderbase AS current
---> 8883f7dfe759
Step 26/38 : COPY . .
---> 6acefabe075e
Step 27/38 : COPY --from=upstream-resources /usr/src/app/md_source/. ./
---> bfcebabe01f5
Step 28/38 : RUN ./_scripts/update-api-toc.sh
---> Running in d5f322b580ed
standard_init_linux.go:190: exec user process caused "exec format error"
The command '/bin/sh -c ./_scripts/update-api-toc.sh' returned a non-zero code: 1
Traceback (most recent call last):
File "/home/me/.local/bin/docker-compose", line 11, in <module>
sys.exit(main())
File "/home/me/.local/lib/python2.7/site-packages/compose/cli/main.py", line 72, in main
command()
File "/home/me/.local/lib/python2.7/site-packages/compose/cli/main.py", line 128, in perform_command
handler(command, command_options)
File "/home/me/.local/lib/python2.7/site-packages/compose/cli/main.py", line 1077, in up
to_attach = up(False)
File "/home/me/.local/lib/python2.7/site-packages/compose/cli/main.py", line 1073, in up
cli=native_builder,
File "/home/me/.local/lib/python2.7/site-packages/compose/project.py", line 548, in up
svc.ensure_image_exists(do_build=do_build, silent=silent, cli=cli)
[1] | 安装docker https://docs.docker.com/install/linux/docker-ce/centos/ |
[2] | docker run 参数。 https://docs.docker.com/engine/reference/run/ |
[3] | 一个docker教程参考 https://yeasy.gitbooks.io/docker_practice/image/list.html |
[4] | https://forums.docker.com/t/standard-init-linux-go-190-exec-user-process-caused-exec-format-error/49368 |
[5] | https://docs.docker.com/network/proxy/ |