docker的使用

docker安装

contos 安装

  • 安装所需的包。yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper存储驱动程序。

yum install -y yum-utils device-mapper-persistent-data lvm2

  • 设置稳定存储库yum源为阿里docker源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  • 安装 Docker

yum install docker-ce docker-ce-cli containerd.io

Ubuntu 安装

  • 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本
 sudo apt-get remove docker docker-engine docker-ce docker.io
  • 更新apt包索引
sudo apt-get update
  • 安装以下包以使apt可以通过HTTPS使用存储库(repository)
 sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  • 添加Docker官方的GPG密钥
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 使用下面的命令来设置stable存储库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • 再更新一下apt包索引
 sudo apt-get update
  • 安装最新版本的Docker CE
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  • 修改配置文件以供远程访问

vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改为:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock

注意tcp://0.0.0.0:2375 不要这样设置不然你的服务器裂开,最好使用固定的ip

  • 配置加速

vim /etc/docker/daemon.json

  • 添加配置
{"registry-mirrors":["https://registry.docker-cn.com"]}
  • 启动docker

systemctl start docker

docker 离线安装

  • 前置条件

要求系统为64位、Linux系统内核版本为3.8以上,

查看内核命令:cat /proc/version || uname -a

  • 下载离线安装包(可执行文件)

下载链接:https://download.docker.com/linux/static/stable/x86_64/

下载文件docker-20.10.20.tgz

  • 解压taz文件

tar -xvf docker-20.10.20.tgz

  • 将解压的docker目录中的文件全部复制到/usr/bin/目下

cp docker/* /usr/bin/

  • 为docker服务器配置systemctl指令

vim /etc/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

授权:chmod +x /etc/systemd/system/docker.service

  • 创建docker配置文件

vim /etc/docker/daemon.json

{
   "iptables": false,
   "registry-mirrors": [
        "https://registry.docker-cn.com",
        "https://whrqoz7w.mirror.aliyuncs.com"
    ],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "30m",
        "max-file": "3"
    },
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

重载配置文件:systemctl daemon-reload

  • 开启防火墙转发

firewall-cmd --add-masquerade --permanent && firewall-cmd --reload

  • 启动docker服务

systemctl start docker

docker的使用

  • 登录远程docker仓库

sudo docker login --username=masailog registry.cn-zhangjiakou.aliyuncs.com/epnc/epncfit

  • 查找镜像

docker search mysql:8.0

  • 将容器打包成镜像

docker commit old_mysql new_mysql:8.0

  • 导入镜像

docker load -i mysql:8.0.tar

  • 导出镜像

docker save -o mysql.tar mysql:8.0

  • 获取镜像

docker pull mysql:8.0

  • dockerflie制作镜像

docker build -t my_java_service:1.0 .

  • 制作java服务的dockerflie
FROM registry.cn-shanghai.aliyuncs.com/hxtrip/hxtrip-java:latest
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY build/libs/need-sve-1.0-SNAPSHOT.jar dqgs.jar
ENV JAVA_OPTS=""
#ENV spring_cloud_config_profile="test"
EXPOSE 8888
ENTRYPOINT ["java","-Xms128m","-Xmx1024m","-Djava.security.egd=file:/dev/./urandom","-jar","dqgs.jar"]

注意事项 jar 和dockerflie需要在同级目录下面(不要放其他东西,build的时候默认会把同级目录下所有的东西都打包导镜像里面)

  • 新建网络

docker network create --driver bridge --subnet 172.168.1.0/16 --gateway 172.168.1.1 test-work

  • bridge模式(默认):网桥模式,通过虚拟网桥使容器通信。容器有自己的独立ip和端口,特点 docker 会创建docker0网桥,写入iptables规则,docker会为容器创建独有的network namespace,也会为这个命名空间配置好虚拟网卡,路由,DNS,IP地址与iptables规则。

  • host模式:主机模式,与主机共用一个网络,容器ip是主机的ip,端口占用主机的端口范围,特点容器与宿主机IP一致,网络性能高。

  • container模式:与指定容器共享一个网络,类似host模式,但是是两个容器间共用一个ip。

  • none模式:无网络模式,容器有自己的内部网络,但是没有分配ip,路由等信息,需要自己分配。

    注意:bridge模式下重启防火墙,会导致容器内的服务无法连接网络,原因是在bridge模式下,docker会默认写入iptables规则,但是这些规则没有写入磁盘所以当防火墙重启后,规则丢失,容器自然无法上网。

  • 运行容器并加入自己的网络

docker run -itd --name mysql --network test-work mysql:8.0

  • 查看容器日志

docker logs --tail=1000 mysql

注意创建网络是为了方便容器之间可以通过容器名相互访问

  • 进入容器

docker exec -it e0be44c2897b(容器id) /bin/bash

  • 退出容器

exit

  • 删除容器

docker rm -rf e0be44c2897b(容器id)

容器中常用工具的安装

  • 更新下载工具(容器中没有yum)

apt-get update

  • 下载 ifconfig 工具

apt install net-tools

  • 下载 ping 工具

apt install iputils-ping

  • 下载 telnet 工具

apt install telnet

  • 下载 ssh远程连接工具

apt install openssh-server

  • 为了更方便的使用docker,提供了可视化工具portainer

docker pull portainer/portainer

  • 运行portainer

docker run -p 8001:9000 -p 8000:8000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /mydata/portainer/data:/data -d portainer/portainer

  • docker stack 的使用
version: "3"
networks:
  default:
    external:
      name: "网络"
services:
  zts-gis:
    image:  "镜像"
    environment:
      TZ: Asia/Shanghai
      spring.cloud.inetutils.preferredNetworks: 10.0.1
      spring.profiles.active: "配置文件"
      spring.cloud.nacos.discovery.namespace: "命名空间"
      spring.cloud.nacos.config.namespace: "命名空间"
      JDK_JAVA_OPTIONS: -Xmx1024m -Xms512m
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.env == "集群节点"
      labels:
        description: "描述"
      resources:
        limits:
          cpus: '0.50'
          memory: 1024M
        reservations:
          cpus: '0.25'
          memory: 1024M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 2
        window: 120s
  zts-web:
    image: nginx:latest
    ports:
      - "8089:80"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker/data/zts/zts-web/html:/usr/share/nginx/html
      - /opt/docker/data/zts/zts-web/conf/nginx.conf:/etc/nginx/nginx.conf
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.env == "集群节点"
      labels:
        description: "描述"
      resources:
        limits:
          cpus: '0.50'
          memory: 128M
        reservations:
          cpus: '0.25'
          memory: 128M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 2
        window: 120s

  • dokcer yun 运行所带参数详解
-a, --attach=[]            登录容器(必须是以docker run -d启动的容器)  
-d, --d                    后台运行容器,并返回容器ID;
-w, --workdir=""           指定容器的工作目录  
-c, --cpu-shares=0         设置容器CPU权重,在CPU共享场景使用    
-e, --env=[]               指定环境变量,容器中可以使用该环境变量    
-m, --memory=""            指定容器的内存上限    
-P, --publish-all=false    指定容器暴露的端口    
-p, --publish=[]           指定容器暴露的端口   
-h, --hostname=""          指定容器的主机名    
-v, --volume=[]            给容器挂载存储卷,挂载到容器的某个目录    
--volumes-from=[]          给容器挂载其他容器上的卷,挂载到容器的某个目录  
--cap-add=[]               添加权限,权限清单详见:http://linux.die.net/man/7/capabilities    
--cap-drop=[]              删除权限,权限清单详见:http://linux.die.net/man/7/capabilities    
--cidfile=""               运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法    
--cpuset=""                设置容器可以使用哪些CPU,此参数可以用来容器独占CPU    
--device=[]                添加主机设备给容器,相当于设备直通    
--dns=[]                   指定容器的dns服务器    
--dns-search=[]            指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件    
--entrypoint=""            覆盖image的入口点    
--env-file=[]              指定环境变量文件,文件格式为每行一个环境变量    
--expose=[]                指定容器暴露的端口,即修改镜像的暴露端口    
--link=[]                  指定容器间的关联,使用其他容器的IP、env等信息    
--lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc时使用    
--name=""                  指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字  
--net="bridge"             容器网络设置:bridge 使用docker daemon指定的网桥,host     //容器使用主机的网络,container:NAME_or_ID  >//使用其他容器的网路,共享IP和PORT等网络资源,none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false         指定容器是否为特权容器,特权容器拥有所有的capabilities    
--restart="no"             指定容器停止后的重启策略:no:容器退出时不重启,on-failure:容器故障退出(返回值非零)时重启,always:容器退出时总是重启    
--rm=false                 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)    
--sig-proxy=true           设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

注意为了防止docker重启数据丢失这里使用了 -v 参数 将容器里面的数据挂在到服务器主机上

  • 可能遇到的问题容器里面无法访问 主机内网中的网络。

解决方案:

    1.  禁用 docker 的 iptables 规则
    2.  配置daemon.json ,禁用iptables防火墙 "iptables": false
    3.  开启转发
     firewall-cmd --add-masquerade --permanent
     firewall-cmd --reload
    4.  重启docker
    5.  systemctl restart docker
end

评论