Docker随笔

Docker容器化技术简介

docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
在这里插入图片描述
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生并记录在容器层中。只有「容器层是可写的,容器层下面的所有镜像层都是只读的。

Docker生态图谱及常用命令

Docker的生命周期中,Docker会有如下多种形态

  1. Images:就是上文所说的镜像,它没有运行起来的时候是只读的,也正因为这个特性, 它可以被放在任何有Docker守护进程的环境中取运行,通常我们会使用不同的tag来标记它,代表应用程序不同的版本。
  2. Registry:Image仓库,我们通常会把特定版本的应用image放到Image仓库中,这样在服务器部署应用程序的时候,服务器就可以从Registry中方便地拿到对应版本的镜像,然后运行起来。常见的私有Registry仓库有Harbor。
  3. Container:也就是上文所说的容器,它是被运行起来了的镜像,同时它又有Create、Running、Stop、Pause等状态。
  4. Tar files: 我们可以将镜像打成Tar包,也可以将被打包成Tar包的镜像还原,在传输镜像的时候,如果两个机器无法访问同一个Docker仓库,那这个时候就可以将镜像打成Tar包传输。
  5. 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越权

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值