文章目录
Docker容器化技术简介
docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生并记录在容器层中。只有「容器层是可写的,容器层下面的所有镜像层都是只读的。
Docker生态图谱及常用命令
Docker的生命周期中,Docker会有如下多种形态
- Images:就是上文所说的镜像,它没有运行起来的时候是只读的,也正因为这个特性, 它可以被放在任何有Docker守护进程的环境中取运行,通常我们会使用不同的tag来标记它,代表应用程序不同的版本。
- Registry:Image仓库,我们通常会把特定版本的应用image放到Image仓库中,这样在服务器部署应用程序的时候,服务器就可以从Registry中方便地拿到对应版本的镜像,然后运行起来。常见的私有Registry仓库有Harbor。
- Container:也就是上文所说的容器,它是被运行起来了的镜像,同时它又有Create、Running、Stop、Pause等状态。
- Tar files: 我们可以将镜像打成Tar包,也可以将被打包成Tar包的镜像还原,在传输镜像的时候,如果两个机器无法访问同一个Docker仓库,那这个时候就可以将镜像打成Tar包传输。
- Dockerfile:Dockerfile是一个配置文件,它一般用于基于某个基础镜像生成新的镜像,并且在该配置文件中可以自定义Image的内容。
命令图谱如下:(引用自https://www.jianshu.com/p/d4179b6c0332)
常用命令:
systemctl start|stop|restart docker
启动|停止|重启docker
systemctl enable|disable docker
设置开机启动|不启动docker
docker version
显示docker的版本信息
docker tag ab56bba91343 nginx:tag_test
为image添加tag
docker save spring-boot-docker -o /home/wzh/docker/spring-boot-docker.tar
将images保存为tar文件
docker load -i spring-boot-docker.tar
把tar文件加载为images
docker export -o XXX.tar container_id
把某容器导出为tar包,比镜像导出丢弃所有历史记录和元数据信息,但是可以重新定义标签等元数据,体积更小
docker import XXX.tar image_name:tag
导入tar包到本地镜像库
docker run --name runoob-nginx-test -p 8079:80 -d nginx
把一个images跑起来成为一个containers容器,name指定containers名称,p指定端口映射,-d表示后台运行
docker restart|stop|start 8330ccf61427
将一个container重启|停止|启动
docker commit -a"ethan" -m"这是一个commit测试" runoob-nginx-test commit-test:v1.0
将一个containers提交为image,-a表示作者,-m表示说明,runoob-nginx-test为容器名,commit-test:v1.0表示镜像名和tag
docker build -t second:v1.0 .
把一个dockerfile构建一个image,注意有个点,表示当前路径下查找dockerfile文件,-f指向文件
docker logs -f solace
查看运行的solace容器的日志
docker ps -a
查看当前所有containers,-a表示停止的containers也会显示
docker stats -a
查看所有容器的资源占用情况
docker images
查看当前所有的镜像文件
docker exec -it jenkins_test /bin/bash
进入一个名为jenkins_test的容器
docker rm container_name
根据容器名删除该容器,前提是该容器已经停止
docker top container_name
根据容器名显示该容器的进程信息
docker diff container_name
根据容器名查看容器内文件系统的修改
docker rmi images_id
根据image_id移除该镜像,前提是该镜像不存在构造的容器
docker search image_name
根据image_name从远程仓库查看镜像有哪些版本
docker pull image_name:tag
根据image_name从远程仓库拉去镜像到本地,不加tag则默认最新
docker inspect image_name:tag|container_nam
查看镜像|容器详细信息
docker cp containername:/usr/local/tomcat/webapps/test/js/test.js /opt
从容器里面拷文件到宿主机
docker cp /opt/test.js testtomcat:/usr/local/tomcat/webapps/test/js
从宿主机拷文件到容器里面
Docker常用安装方式
1.使用yum直接安装(请确保当前用户有sudo权限)
(1)查看内核版本,高于3.10则可以安装Docker
uname -r
(2)移除机器上可能残留的旧版本Docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
(3)安装必要的系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(4)添加软件源信息,软件源repo文件一般都放在/etc/yun.repo.d中(如果无法访问docker网站,可使用阿里镜像)
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
(5)查看可安装的docker版本,并选择安装想要的版本
yum list docker-ce --showduplicates|grep "^doc"|sort -r
yum install docker-ce-19.03.12-3.el7 docker-ce-cli-19.03.12-3.el7 containerd.io
(6)企业级Docker一般是不允许直接使用root来管理的,通常会有非root用户来管理Docker,此时可以将指定用户假如docker用户组中,获得Docker使用权限,并设置docker开机启动,重启docker
usermod -aG docker username
systemctl enable docker
systemctl restart docker
(7)测试Docker是否安装成功
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
(8)安装基于Docker的编排工具Docker-compose
curl -L https://github.com/docker/compose/releases/download/1.23.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
2.使用rpm编译安装(新手不推荐,对版本严格要求及不可访问外网可用)
(1)使用rpm安装较为繁琐,不同版本有不同的依赖需要安装,安装前需要到官网找到对应的rpm包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
(2)编译安装docker-ce,不同版本的rpm所需要的依赖不同,如下有19.03版本的安装示例:
yum install policycoreutils -y
rpm -Uvh selinux-policy-targeted-3.13.1-268.el7.noarch.rpm selinux-policy-3.13.1-268.el7.noarch.rpm container-selinux-2.119.1-1.c57a6f9.el7.noarch.rpm
rpm -Uvh containerd.io-1.4.3-3.1.el7.x86_64.rpm
rpm -ivh docker-ce-cli-19.03.12-3.el7.x86_64.rpm
rpm -ivh docker-ce-19.03.12-3.el7.x86_64.rpm
curl -L https://github.com/docker/compose/releases/download/1.23.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v
systemctl daemon-reload
systemctl enable docker
systemctl restart docker
docker version
Docker配置文件解析
1./etc/docker/daemon.json
docker安装后默认没有daemon.json这个配置文件,需要进行手动创建。配置文件的默认路径:/etc/docker/daemon.json
官方的配置地址:https://docs.docker.com/engine/reference/commandline/dockerd/#/configuration-reloading。
官方的配置地址:https://docs.docker.com/engine/reference/commandline/dockerd/#options
官方的配置地址:https://docs.docker.com/engine/reference/commandline/dockerd/#/linux-configuration-file
配置 registry 私库示例:
# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://d8b3zdiw.mirror.aliyuncs.com"
], #这个私库的服务地址
"insecure-registries": [
"https://ower.site.com"
],
} #私库加速器
# ls -trl /etc/docker/daemon.json
-rw-r--r-- 1 root root 71 Dec 19 17:25daemon.json
最后重启reloaddocker使其生效:
sudo systemctl daemon-reload
2. /usr/lib/systemd/system/docker.service
systemd启动的配置文件是由环境变量获得的。而环境变量是在/etc/sysconfig/docker,/etc/sysconfig/docker-storage,/etc/sysconfig/docker-network内,可以依次查看
(1)在该配置中为Dokcer配置代理
[Service]
Environment="HTTP_PROXY=http://代理服务器ip:port" "HTTPS_PROXY=http://代理服务器ip:port" "NO_PROXY=localhost,127.0.0.1"
(2)配置Docker的存储路径为/data/docker/lib,默认为/var/lib/docker
[Service]
ExecStart=
#ExecStart=/bin/dockerd -g /data/docker/lib -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecStart=/bin/dockerd -g /data/docker/lib -H unix:///var/run/docker.sock
EOD
(3)在该配置中开启远程API访问端口
添加-H 0.0.0.0:2375,端口可以随意指定,修改后的ExecStart如下:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 0.0.0.0:2375
重新加载配置并重启docker
systemctl daemon-reload && systemctl restart docker
访问http://127.0.0.1:2375/info进行验证
(4)在该配置中修改bridge网络的ip段
执行docker network inspect bridge命令可以发现bridge网络默认的IP段是172.17.0.0/16,添加--bip 10.0.0.1/16修改默认IP段
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip 10.0.0.1/16
重新加载配置并重启docker
systemctl daemon-reload && systemctl restart docker
启动一个nginx容器进行验证
docker run -dP --name nginx nginx
docker inspect --format '{{ .NetworkSettings.IPAddress }}' nginx
docker rm -f nginx
(5)在该配置中配置私有镜像仓库.
以下示例配置develop-harbor.geostar.com.cn,test-harbor.geostar.com.cn,release-harbor.geostar.com.cn三个私有镜像仓库
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock \
--insecure-registry develop-harbor.geostar.com.cn \
--insecure-registry test-harbor.geostar.com.cn \
--insecure-registry release-harbor.geostar.com.cn \
重新加载配置并重启docker
systemctl daemon-reload && systemctl restart docker
手动拉取私有镜像仓库中的镜像验证
(6)在该配置中配置dns
以下示例配置114.114.114.114和8.8.8.8两个dns服务器地址
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock \
--dns 114.114.114.114 \
--dns 8.8.8.8
重新加载配置并重启docker
systemctl daemon-reload && systemctl restart docker
启动一个alpine容器镜像验证resolv.conf配置文件是否成功修改
docker run --rm alpine cat /etc/resolv.conf
Docker-compose重要启动参数
1.文件挂载
对于容器而言,运行时存在,移除掉时消失,那如何做到数据持久化呢,当容器因为意外情况被移除掉,不想有产生的数据被丢弃,docker提供了数据持久化方案,将数据挂载到宿主机,如下/opt/vmr/data为宿主机文件路径,该路径文件或文件夹内容会覆盖容器中的/usr/sw/data内容
volumes:
- /opt/vmr/data:/usr/sw/data
- /opt/vmr/config:/var/lib/config
2.端口映射
当docker-compose中网络模式如下的时候,该容器与宿主机共用所有端口,除此之外,还有bridge,overlay,front等,可以参考https://blog.csdn.net/Kiloveyousmile/article/details/79830810
network_mode: "host"
可设置自定义的端口映射规则,如下49100是宿主机端口,22是容器中端口,添加如下规则后,访问宿主机29100端口将会访问到该容器的22端口
ports:
- "8000:8000"
- "49100:22"
当docker-compose中网络模式为
4.环境变量
配置的这些环境变量可被容器读取
environment:
nodetype: message_routing
routername: nphbsolace
system_scaling_maxconnectioncount: 10000
3.性能设置
ulimits:
core: -1
nproc: 65535
memlock: -1
nofile:
soft: 2448
hard: 42192
4.日志设置
logging:
driver: "json-file"
options:
max-size: "20m"
max-file: "5"
5.其它设置
image: dockerhub/nginx:latest
container_name: nginx
restart: always
network_mode: "host"
shm_size: "2gb"
mem_swappiness: -1
mem_reservation: 0
hostname: npnginx
Docker常见问题及解决方案
1.网络错误
有时你会看到怪异的网络错误,像地址不能解析、不能ping通等等。通常是由于主机的网络配置被更改了(例如,你切换到了WiFi网络等),这时可以重启VM获得更新过的网络配置。
2.清理
下面的 docker-clean命令可以删除所有没有tag的image和停止的容器。 可定期运行该命令去清理VM。
docker ps -aqf status=exited | xargs docker rm
docker images -qf dangling=true | xargs docker rmi
3.更改Docker的lvm挂载方式从loop-vm至direct-lvm
(参考链接http://www.ebanban.com/?p=642)
Docker安装后默认在/var/lib/docker/devicemapper/devicemapper目录下生成data和metadata两个文件用于存放docker的数据,然而这种默认的loop-lvm挂载方式不适合生产环境使用,并且你也会收到docker的如下提示,生产环境应改为direct-lvm方式。
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
Use --storage-opt dm.thinpooldev
to specify a custom block storage device.
以下是更改docker device mapper的方法
允许Docker配置direct-lvm模式,编辑/etc/docker/daemon.json文件(如果该文件不存在则进行创建),参数表如下
dm.directlvm_device:块设备路径(必须)
dm.thinp_percent:块设备使用比率,默认95
dm.thinp_metapercent:元数据使用比率,默认1
dm.thinp_autoextend_threshold:自动扩容阈值,默认80
dm.thinp_autoextend_percent:自动扩容比率,20
dm.directlvm_device_force:强制格式化设备,默认false
以下为示例:
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.directlvm_device=/dev/xdf",
"dm.thinp_percent=95",
"dm.thinp_metapercent=1",
"dm.thinp_autoextend_threshold=80",
"dm.thinp_autoextend_percent=20",
"dm.directlvm_device_force=false"
]
}
重启docker则生效sudo systemctl restart docker
给力的Docker相关指令
清空所有docker容器和镜像:
docker ps -a | awk '{print $1 }'|xargs docker rm -f || true
docker images| awk '{print $3 }'|xargs docker rmi || true
重启所有docker容器
docker ps -a | awk '{print $1 }'|xargs docker restart || true
使用rpm卸载docker-ce
rpm -qa|grep docker
rpm -e docker-ce
rpm -e docker-ce-cli
rm -rf /var/lib/docker
rpm -qa|grep docker
Docker越权