Docker容器操作

  1. 查看容器:

    $ sudo docker ps -a

  2. 打开容器:

    sudo docker statr “CONTAINER ID”

    $ sudo docker start cc32bf495919 //举例:打开portainerUI

  3. 操作容器:

    $ sudo docker exec -it “container-name” bash // 进入容器操作界面

  4. 退出容器:

    1. 直接exit退出容器,会关闭当前容器;
    2. 通过按Ctrl+P+Q进行退出容器,此时不会关闭当前容器。
  5. 宿主机与容器间数据互传:

    宿主机传给容器:
    

    $ sudo docker cp /home/gysg/developer/catalina.sh tomcat:/usr/local/tomcat/bin/

    容器传给宿主机:

    $ sudo docker cp tomcat:/usr/local/tomcat/bin/catalina.sh /home/gysg/developer/

    文件权限不一致造成运行问题,因此需要把权限取消或者还原

    $ sudo chmod 777 -R dirs // 设置为777,任何人都可以操作

    $ sudo chmod 644 -R dirs // 设置为root权限

  6. 容器运行说明:

    $ docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

    -d: 后台运行容器,并返回容器ID;

    -i: 以交互模式运行容器,通常与 -t 同时使用;

    -P: 随机端口映射,容器内部端口随机映射到主机的高端口

    -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

    --name="nginx-lb": 为容器指定一个名称;
  7. 自动重启设置:

    在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:

    $ sudo docker run –restart=always

    如果已经启动了则可以使用如下命令:

    $ sudo docker update –restart=always

CentOS 8中安装Docker

官方参考地址:https://docs.docker.com/install/linux/docker-ce/centos/

里面包含包下载地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

  1. 安装依赖

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

    $ sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

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

    如果报错:Problem: package docker-ce-3:19.03.4-3.el7.x86_64 requires containerd.io >= 1.2.2-3 那就先装新版的 containerd.io

    $ sudo dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

  2. 再装剩下两个

    $ sudo yum install docker-ce docker-ce-cli

    $ sudo systemctl start docker

    $ docker –version

  3. 开机自启

    $ sudo systemctl enable docker

CentOS 8中安装Docker出现和Podman冲突

  1. 查看是否安装 Podman

    rpm -q podman

  2. 删除Podman

    dnf remove podman

  3. 安装 Docker

    dnf install docker-ce docker-ce-cli

Docker下安装图形化工具

docker 图形页面管理工具常用的有三种,DockerUI ,Portainer ,Shipyard  。DockerUI 是 Portainer 的前身,这三个工具通过docker  api来获取管理的资源信息。平时我们常常对着shell对着这些命令行客户端,审美会很疲劳,如果有漂亮的图形化界面可以直观查看docker资源信息,也是非常方便的。今天我们就搭建单机版的三种常用图形页面管理工具。这三种图形化管理工具以Portainer最为受欢迎。

安装轻量级图形页面管理之Portainer:

  1. 查看portainer镜像

    $ docker search portainer

  2. 选择喜欢的portainer风格镜像,下载

    $ docker pull portainer/portainer

  3. 启动dockerui容器

    $ docker run –restart=always -d –name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

  4. 浏览器访问 http://192.168.2.119:9000 , 设置一个密码即可,点击创建用户

Docker下安装MySQL8

  1. 安装MySQL源

    $ sudo docker pull mysql:8.0.20 // 指定版本号安装MySQL

  2. 第一次启动

    $ sudo docker run -p 3306:3306 –name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20

  3. 配置持久化数据

    1. 根目录创建目录:

      $ mkdir /workdir

    2. 目录迁移:

      $ cp /var/lib/mysql /workdir/

    3. 配置信息修改:

      打开/etc/mysql目录下的my.cnf配置文件,修改其中的 ”datadir = /workdir/mysql“,再重新存入原位置

      $ sudo /home/***/my.cnf mysql:/etc/mysql

    4. 重启容器MySQL

  4. 修改加密规则

    $ docker exec -it mysql bash // 进入MySQLcontainer

    $ mysql -uroot -p123456 // 登录MySQL

    $ alter user ‘root‘@’%’ identified by ‘123456’ password expire never;

    $ alter user ‘root‘@’%’ identified with mysql_native_password by ‘123456’;

    $ create user ‘xxh‘@’%’ identified with mysql_native_password by ‘xxh123!@#’;

    $ GRANT ALL PRIVILEGES ON . TO ‘xxh‘@’%’;

    $ flush privileges; // 使设置立即生效

  5. 镜像拉取问题

    默认会拉取最新版本的镜像,然而却总是卡在某段动也不能动……

    解决方案先修改宿主机下的 /etc/docker/的daemon.json文件,此处网上有多种修改方案我也试过几种…最后用的是下面这个:

    1
    2
    3
    {
    "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
    }
  6. dockerfile配置

    1
    2
    3
    4
    5
    6
    7
    container_name: 'local_db'
    build: ./services/mysql
    environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    ports:
    - "3306:3306"
    volumes:
    - ${MYSQL_DATA_PATH}:/var/lib/mysql
  7. 数据持久化(不推荐)

    1
    2
    3
    4
    1. 需要在修改mysql容器中的根目录下,新建目录 mdkir /workdir  。
    2. 将 /var/lib/mysql 复制 到新建目录中。
    3. 修改 /etc/mysql/my.cnf
    datadir = /workdir/mysql

Docker下安装Tomcat

  1. 安装Tomcat

    $ sudo docker pull tomcat:latest

  2. 设置Tomcat时区一致

    在tomcat/bin下的catalina.sh最后加上下面这一句即可:

    JAVA_OPTS=”${JAVA_OPTS} -Duser.timezone=GMT+08”

  3. 启动Tomcat

    $ sudo docker run -p 8090:8080 –name tomcat -d tomcat:latest

    或者如下:

    $ sudo docker run –name tomcat -d -p 8090:8080 -v /home/gysg/developer/websoft:/usr/local/tomcat/webapps -v /mnt/data:/mnt/data tomcat-gysg:2.0

给运行中Docker容器安装SSH服务

这里我以我本地一个运行中的SQL Server的数据库服务为例

1、打开命令面板,输入指令docker ps查看运行中的容器并复制容器ID

2、输入指令docker exec -it <复制的容器ID> /bin/sh,进入命令行工具

3、进入命令行工具后首先建议输入指令apt-get update更新下源

4、输入指令apt-get install openssh-server,安装SSH服务

5、安装完毕后,输入指令service ssh satrt 启动SSH服务

6、使用vim进入/etc/ssh/sshd.config文件更改SSH服务配置,将PermitRootLogin的值从withoutPassword改为yes,允许root用户进行登录

7、输入指令passwd root设置root用户登录密码

8、如果docker容器中没有安装vim,则输入指令apt-get install vim进行安装

9、输入指令service ssh restart重启SSH服务

10、输入exit退出当前容器命令行工具

11、回到系统命令面板,输入指令docker ps查看当前运行中的容器并复制安装好SSH服务的容器ID

12、为了避免后期因为各种原因重复安装SSH服务,建议输入指令docker commit <复制的容器ID> <自己定义的镜像名>,保存经想到本地

13、停止当前镜像,输入指令docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=567rty%^&YUI' -p 1433:1433 -p 8400:20 -d microsoft/mssql-server-linux:latest,启动刚才保存在本地的镜像并把SSH服务的20端口映射出来,这里我映射的是主机8400duankou

14、为了方便,这里还可以输入指令docker update --restart=always <容器ID>让容器保持始终运行。

Docker下DNS解析出错的处理

Temporary failure in name resolution(域名解析暂时失败)

​ 我的操作环境为CentOS 8,与CentOS 7使用命令完全一致。其他不同Linux系统版本命令可能会有所不同,请根据自己的系统版本使用对应命令,直接百度相关操作即可。

  1. 检查主机网络设置

    查看系统是否打开ip地址转发功能:

    $ cat /proc/sys/net/ipv4/ip_forward // 返回0则说明未打开,开启ip地址转发

    使用命令打开配置文件:

    $ vi /etc/sysctl.conf

    打开内核配置文件,查找net.ipv4.ip_forward = 0,将其修改为net.ipv4.ip_forward = 1,若该行开头有#,将其去掉;若配置文件中没有此项,则在文件最后添加此内容。
    

    保存修改后,重启系统或输入以下命令使修改生效:

    $ sysctl -p /etc/sysctl.conf
    $ systemctl restart network

    检查一下问题是否解决,若没有则进入下一步排查。

  2. 检查主机防火墙配置

    查看防火墙状态(若防火墙为关闭状态,可跳过防火墙有关设置):

    $ sudo firewall-cmd –state

    若返回runging,则防火墙为开启状态,查看防火墙是否开启ip地址转发(ip地址伪装):

    $ sudo firewall-cmd –query-masquerade

    若返回no,则输入以下命令开启ip地址转发:

    $ sudo firewall-cmd –add-masquerade –permanent

    然后输入以下命令使修改生效:

    $ sudo firewall-cmd –reload

    再次检查问题是否已经解决,若没有则进行再一步排查。

  3. 设置Docker指定DNS服务器

    打开Docker相关设置文件(宿主机内),没有就新建一个,输入下列命令会打开或自动新建:

    $ vi /etc/docker/daemon.json

    在文件中输入以下内容:

    {
        "dns": ["8.8.8.8","114.114.114.114"]
    }
    

    8.8.8.8和114.114.114.114是两个DNS服务器,可以修改或增加。

    然后重启Docker:

    $ systemctl restart docker

    到这里问题应该就可以得到解决了。

修改容器配置文件,重启docker服务

  1. 容器的配置文件路径

    /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json`

    其中的hashofthecontainer是docker镜像的hash值,可以通过docker ps或者docker inspect containername查看。(CONTAINER ID就可以看出来)

  2. 按需修改端口, 按需修改挂载目录(权限和属主属组要相同),然后重启docker服务

  3. 格式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    {
    "Binds":
    ["/srv/gitlab/logs:/var/log/gitlab",
    "/srv/gitlab/data:/var/opt/gitlab",
    "/srv/gitlab/config:/etc/gitlab"],
    "ContainerIDFile":"",
    "LogConfig":
    {"Type":"journald","Config":{}},
    "NetworkMode":"default",
    "PortBindings":
    {"22/tcp":[{"HostIp":"","HostPort":"10022"}],
    "443/tcp":[{"HostIp":"","HostPort":"10443"}],
    "80/tcp":[{"HostIp":"","HostPort":"10080"}]},
    "RestartPolicy":
    {"Name":"always","MaximumRetryCount":0},
    "AutoRemove":false,
    "VolumeDriver":"",
    "VolumesFrom":null,
    "CapAdd":null,
    "CapDrop":null,
    "Dns":[],
    "DnsOptions":[],
    "DnsSearch":[],
    "ExtraHosts":null,
    "GroupAdd":null,
    "IpcMode":"",
    "Cgroup":"",
    "Links":[],
    "OomScoreAdj":0,
    "PidMode":"",
    "Privileged":false,
    "PublishAllPorts":false,
    "ReadonlyRootfs":false,
    "SecurityOpt":null,
    "UTSMode":"",
    "UsernsMode":"",
    "ShmSize":67108864,
    "Runtime":"docker-runc",
    "ConsoleSize":[0,0],
    "Isolation":"",
    "CpuShares":0,
    "Memory":0,
    "NanoCpus":0,
    "CgroupParent":"",
    "BlkioWeight":0,
    "BlkioWeightDevice":null,
    "BlkioDeviceReadBps":null,
    "BlkioDeviceWriteBps":null,
    "BlkioDeviceReadIOps":null,
    "BlkioDeviceWriteIOps":null,
    "CpuPeriod":0,
    "CpuQuota":0,
    "CpuRealtimePeriod":0,
    "CpuRealtimeRuntime":0,
    "CpusetCpus":"",
    "CpusetMems":"",
    "Devices":[],
    "DiskQuota":0,
    "KernelMemory":0,
    "MemoryReservation":0,
    "MemorySwap":0,
    "MemorySwappiness":-1,
    "OomKillDisable":false,
    "PidsLimit":0,
    "Ulimits":null,
    "CpuCount":0,
    "CpuPercent":0,
    "IOMaximumIOps":0,
    "IOMaximumBandwidth":0
    }
  4. Tomcat配置

    [“/home/gysg/developer/websoft:/usr/local/tomcat/webapps”, “/mnt/data:/mnt/data”]

    sudo docker run --name tomcat-new-01 -d -p 8090:8080 -v /home/gysg/developer/websoft:/usr/local/tomcat/webapps -v /mnt/data:/mnt/data tomcat-new-01:latest
    

Docker的备份与还原

  1. 备份容器

    $ docker ps // 查看已创建的容器

    $ docker commit -p “CONTAINER ID” container-name // 提交生成镜像快照

  2. 镜像打包

    1. 提交镜像到docker hub

      ​        如果我们想要在Docker注册中心上传或备份镜像,我们只需要运行 docker login 命令来登录进Docker注册中心,然后推送所需的镜像即可。
      

      代码如下:

      $ docker login // username: password:

      $ docker tag “IMAGE ID” “filepath/image-name:tag” // 打标记

      $ docker push “filepath/image-name” // 提交

    2. 保存镜像到本地文件

      $ docker save -o ~/container-backup.tar container-backup // 备份路径.tar 要备份的镜像名称

  3. 恢复备份

    1. 远程恢复

      $ docker pull “filepath/image-name:tag”

    2. 本地恢复

      $ docker load -i ~/container-backup.tar // 备份路径.tar

  4. 加载新容器

    docker run …

  5. 重启docker

    $ sudo systemctl restart docker

Docker报错日常docker: Error response from daemon:

解决方法:

  1. 停止所有的容器,有时候也不需要全部停止
1
docker stop $(docker ps -q)
  1. 强制移除此容器
1
docker rm -f mysql1
  1. 清理此容器的网络占用

格式:docker network disconnect --force 网络模式 容器名称

示例:docker network disconnect --force bridge mysql1

  1. 简查是否还有同名容器占用

格式:docker network inspect 网络模式
示例:docker network inspect bridge

  1. 重新构建容器
1
docker run --name mysql1 -d -p3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
  1. Tomcat启动运行缓慢处理

    1. 直接改jdk的配置

      打开jdk安装路径 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:

      securerandom.source=file:/dev/random

      替换成:

      securerandom.source=file:/dev/./urandom

    2. 或者在启动时加上如下参数:

      $ -e JAVA_OPTS=”-Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom”

    3. 或者修改catlina.sh,在第一行加入以下代码:

      1
      2
      3
      4
      > if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
      > JAVA_OPTS="$JAVA_OPTS -Djava.security.egd="
      > fi
      >

Docker镜像无法删除的问题

$ sudo docker image ls

$ sudo docker rm -f tomcat:latest

Docker下执行构建命令

$ sudo docker build -t image-name:tag .

Docker下创建kms服务器

  1. 启动KMS服务器:

    $ sudo docker run -idt -p 1688:1688 –name kms-server vlmcsd

  2. 启动Tomcat服务器:

    $ sudo docker run –name tomcat -dit -p 8090:8080 -v /etc/localtime:/etc/localtime:ro -v /home/gysg/developer/websoft:/usr/local/soft/tomcat/webapps -v /mnt/data:/mnt/data tomcat-gysg:2.0

    $ sudo docker run –name tomcat -dit -p 8080:8080 -v /etc/localtime:/etc/localtime:ro -v /home/pi/developer/websoft:/usr/local/soft/tomcat/webapps -v /mnt/data:/mnt/data -v /mnt/usb/movie:/mnt/usb/movie tomcat-gysg:9.1.arm

  3. 启动MySQL数据库:

    $ sudo docker run -p 3306:3306 –name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20

  4. 启动图形化管理界面:

    $ docker run –restart=always -d –name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

  5. Nginx启动:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > docker run --detach \
    > --name nginx \
    > -p 443:443\
    > -p 80:80 \
    > -v /nginx/data:/usr/share/nginx/html:rw\
    > -v /nginx/config/nginx.conf:/etc/nginx/nginx.conf/:rw\
    > -v /nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf:rw\
    > -v /nginx/logs:/var/log/nginx/:rw\
    > -v /nginx/ssl:/ssl/:rw\
    > -d nginx
    >
  6. Jenkins启动:

    1. 创建一个jenkins目录

      $ mkdir /home/jenkins_home;

    2. 启动一个jenkins容器

      $ sudo docker run -d –name jenkins -p 9100:8080 -p 50000:50000 -v /home/gysg/developer/jenkins:/var/jenkins_home -v /home/gysg/developer/android-sdk:/var/android-sdk jenkins/jenkins:lts