Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 。容器是完全使用沙箱 机制,相互之间不会有任何接口。
安装
ubuntu
参考官网文档 。
amazon linux 2
1 2 3 sudo amazon-linux-extras install epel -y sudo amazon-linux-extras enable docker sudo yum install -y docker
配置
修改 data 目录
1 2 3 4 # vim /etc/docker/daemon.json { "data-root": "/data/docker" }
容器
从镜像创建新容器
1 2 3 4 $ docker run -it -d --restart=always --name=ubuntu-18.04 ubuntu:18.04 # 指定端口 $ docker run --restart=always -p 8080:8080 <image-name>
启动已创建容器
1 $ docker start container_id/container_name
查看运行的容器
使用docker ps
命令可以查看所有正在运行中的容器列表,使用docker inspect
命令我们可以查看更详细的关于某一个容器的信息。
停止运行容器
1 docker stop container-name
示例
为了显示更直观, 删除部分内容并使用省略号代替.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root@VirtualBox:/home/conpot# docker ps CONTAINER ID IMAGE ... 5a794455532d nginx:alpine ... 8518250908b5 voxxit/rsyslog ... 77613e26eb6f elk_logstash ... 7effd23c7005 elk_kibana ... root@VirtualBox:/home/conpot# docker stop 5a794455532d 5a794455532d root@VirtualBox:/home/conpot# docker ps CONTAINER ID IMAGE ... 8518250908b5 voxxit/rsyslog ... 77613e26eb6f elk_logstash ... 7effd23c7005 elk_kibana ... root@VirtualBox:/home/conpot# docker stop 8518 8518 root@VirtualBox:/home/conpot# docker ps CONTAINER ID IMAGE ... 77613e26eb6f elk_logstash ... 7effd23c7005 elk_kibana ...
停止所有运行的容器
1 2 3 4 5 6 7 root@VirtualBox:/home/conpot# docker ps -q 77613e26eb6f 7effd23c7005 root@VirtualBox:/home/conpot# docker stop $(docker ps -q) 77613e26eb6f 7effd23c7005 root@VirtualBox:/home/conpot# docker ps -q
重命名容器
1 $ docker rename CONTAINER NEW_NAME
更新容器设置
1 $ docker update --restart=always container_name/container_id
执行命令
1 $ docker exec -it [container] /bin/bash
列出所有容器
删除容器
1 $ docker docker rm container-name
迁移容器
1 2 3 4 5 6 7 8 9 10 11 12 # 为 container 创建镜像 $ sudo docker commit <container-name> <image-name># 导出镜像 $ sudo docker save <image-name> > image-name.tar# 或 sudo docker save <image-name> -o image-name.tar # # 导入镜像 $ sudo docker load < image-name.tar# 创建 container $ sudo docker run -d --name <container-name> ... <image-name>
为容器添加持久化存储
使用本地存储
1 2 3 $ docker run -d --name {name} --restart always \ -v /path/to/local/system:/container/path \ {image}
使用 Docker Volumn
1 2 3 4 $ docker volume create {volumn-name} $ docker run -d --name {name} --restart always \ -v {volumn-name}:/container/path \ {image}
镜像
导出镜像
1 2 3 4 5 $ docker save busybox > busybox.tar $ docker save -o fedora-all.tar fedora $ docker save -o fedora-latest.tar fedora:latest # 压缩 $ docker save myimage:latest | gzip > myimage_latest.tar.gz
加载镜像
1 2 $ docker load -i docker-output.tar $ docker load < docker-output.tar
Search
下载
查看下载的容器
1 2 $ docker images $ docker images ubuntu
分析镜像大小
参考工具 dive 。
1 dive hub.docker.com/<user>/<image>:<tag>
删除镜像 / 清理
1 2 3 $ docker image remove <id > $ docker image prune $ docker image prune -a
导出/加载容器
1 2 docker export container-name > latest.tar docker export --output="latest.tar" container-name
非 root 用户使用 docker
ubuntu
https://www.jianshu.com/p/35cdb71a32d3
1 2 3 4 5 6 $ sudo groupadd docker$ sudo usermod -aG docker $(whoami )# 生效 $ sudo service docker restart$ newgrp - docker
通过 snap 安装的 docker
1 2 3 4 5 $ sudo addgroup --system docker$ sudo adduser $USER docker$ newgrp docker $ sudo snap disable docker$ sudo snap enable docker
macos
bash rc 添加如下内容。
1 2 3 4 unset DOCKER_TLS_VERIFY unset DOCKER_CERT_PATH unset DOCKER_MACHINE_NAME unset DOCKER_HOST
拷贝文件
从容器拷贝至宿主机
1 docker cp <container-name>:/path/to/file /path/to/dest
从宿主机拷贝至容器
1 docker cp /path/to/file <container-name>:/path/to/dest
docker hub
1 2 3 4 5 # 登录 docker hub docker login # 登录私有仓库 docker login hub.private.com
配置代理
~/.docker/config.json
注意,这是 docker cli 的配置,不是 daemon 的配置。
1 2 3 4 5 6 7 8 9 { "proxies" : { "default" : { "httpProxy" : "http://proxy.example.com:3128" , "httpsProxy" : "https://proxy.example.com:3129" , "noProxy" : "*.test.example.com,.example.org,127.0.0.0/8" } } }
/etc/docker/daemon.json
注意:
这是 daemon 的配置,不是 docker cli 的配置
httpProxy (docker cli)和 http-proxy(docker daemon)的差别
https-proxy 配置成 http 也是可以的,比如 "https-proxy": "http://proxy.example.com:3128"
1 2 3 4 5 6 7 { "proxies" : { "http-proxy" : "http://proxy.example.com:3128" , "https-proxy" : "https://proxy.example.com:3129" , "no-proxy" : "*.test.example.com,.example.org,127.0.0.0/8" } }
重启生效。
1 2 3 sudo systemctl restart docker # 或 sudo service docker restart
其他
1 2 3 4 5 6 7 8 9 10 11 sudo mkdir -p /etc/systemd/system/docker.service.d sudo touch /etc/systemd/system/docker.service.d/proxy.conf sudo chmod 777 /etc/systemd/system/docker.service.d/proxy.conf sudo echo ' [Service] Environment="HTTP_PROXY=socks5://192.168.6.19:3213" Environment="HTTPS_PROXY=socks5://192.168.6.19:3213" ' >> /etc/systemd/system/docker.service.d/proxy.conf sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl restart kubelet
参考
配置网络
centos
1 2 3 4 5 6 ``` # 修改 `/var/lib/docker` 路径 ```shell sudo vim /lib/systemd/system/docker.service
参考
异常
failed to start daemon: Devices cgroup isn't mounted
1 2 3 4 5 6 yum install libcgroup libcgroup-tools libcgroup-pam systemctl enable cgconfig systemctl start cgconfig # 重启 reboot
常用操作
查看磁盘占用
1 2 3 4 5 docker system df -v # 会打印 image、container 的磁盘占用 # 查看容器磁盘占用 docker ps --size
清理无用镜像
1 2 3 4 5 6 7 8 docker image prune # 仅清理镜像 # !危险操作 docker system prune # 要同时清理未使用的镜像、停止的容器、未使用的网络和未挂载的卷 # !危险操作,可能误删 # 尝试删除所有镜像 docker image ls -a | awk '{print $3}' | xargs docker image rm -
TroubleShooting
dockerd
有时候,dockerd 会给出一些错误信息。
1 2 ~/code/private-config/nodes/home$ dockerd unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives don't match any configuration option: noProxy