Docker汇总

常用命令

  1. 动态查看容器日志(最近10行)
    docker logs -f -t --tail 10 容器名

  2. 查看镜像列表和详细信息

    1
    2
    3
    docker images
    docker inspect 镜像名称:TAG
    docker inspect 镜像ID
  3. 查看卷组列表和详细信息

    1
    2
    docker volume ls
    docker volume inspect # 查看到的volume_name
  4. 删除镜像
    docker rmi 镜像名:TAG

  5. 备份镜像
    docker save centos:7 > /opt/centos7.tar.gz

  6. 恢复镜像
    docker load < /opt/centos7.tar.gz

  7. 删除容器

    1
    2
    3
    4
    5
    docker ps -a
    docker stop 容器
    docker rm 容器 或 docker rm -f 容器
    docker rm $(docker ps -a -q)
    # 用于批量删除所有容器,正在运行的不会被删除,如果加了参数-f 就会将运行中的也删除了!!!
  8. 进入容器
    docker exec -it 容器的ID /bin/bash

  9. 查看容器的详细信息
    docker inspect 容器ID

安装Docker

测试环境安装Docker

curl -sSL https://get.docker.com/ | sh

测试环境安装docker-compose

1
2
3
4
5
6
7
8
# 下载 Docker-Compose 二进制包
curl -L https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

# 给文件增加执行权限
chmod +x /usr/local/bin/docker-compose

# 检查 Docker-Compose 版本
docker-compose -v

生产环境

1
2
3
4
5
6
7
8
9
10
$ curl -o /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

$ yum install docker-ce -y
$ curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ chmod +x /usr/local/bin/docker-compose
$ docker -v
$ docker-compose -v
$ systemctl start docker
$ systemctl enable docker

容器自启/取消自启

修改docker容器是否跟随docker服务自启动。

  1. 设置容器jira_mc跟随docker服务自启
    docker update --restart=always jira_mc

  2. 设置容器jira_mc不跟随docker服务启动
    docker update --restart=no jira_mc

从阿里云推拉镜像

  1. 上传镜像到阿里
    1
    2
    3
    $ docker login --username=131xxx@qq.com registry.cn-hangzhou.aliyuncs.com
    $ docker tag 9b4ab3aa45a8 registry.cn-hangzhou.aliyuncs.com/wuxidocker/zentao:11.5
    $ docker push registry.cn-hangzhou.aliyuncs.com/wuxidocker/zentao:11.5
  2. 从阿里下载镜像
    1
    2
    $ docker login --username=131xxx@qq.com registry.cn-hangzhou.aliyuncs.com
    $ docker pull registry.cn-hangzhou.aliyuncs.com/wuxidocker/zentao:11.5

镜像加速

1
2
3
4
5
6
7
$ vim /etc/docker/daemon.json        #没有就创建
{
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"] # 调整为阿里的国内镜像源
}

$ systemctl daemon-reload
$ docker version

qianj的加速器https://2pumyfq5.mirror.aliyuncs.com

查看容器映射的目录关系

docker inspect container_name | grep Mounts -A 20

调整docker存储位置

因为默认下载的镜像都会存在/var/lib/docker/目录下,一般此目录是在/目录下的,可能/分配的空间不会太大。

建议加一块数据盘,然后调整docker数据存放位置到这个新加的数据盘,

例如数据盘挂载到/docerdata目录。

1
2
3
4
5
6
7
8
9
10
11
$ mkdir /dockerdata

$ cp -ar /var/lib/docker/ /dockerdata/

$ vim /etc/docker/daemon.json
"graph": "/dockerdata/docker" #在镜像源下一行添加一行新的存储路径
# 上面是老版本中使用,实操验证是要添加下面这行
"data-root": "/data/docker/docker"

$ systemctl daemon-reload
$ systemctl restart docker

使用docker info可以看到很多信息。比如运行的容器数量,包括docker的根目录(即数据的存放路径),已经配置的镜像加速地址(Registry Mirrors)

实操调整docker存储位置

  1. 调整之前的信息。打算将位置调整到/data/docker目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    root@u2-virtual-machine:~# df -h | grep -v tmpfs
    Filesystem Size Used Avail Use% Mounted on
    /dev/sda3 94G 56G 34G 63% /
    /dev/sda4 200G 43G 148G 23% /data
    /dev/sda2 512M 6.1M 506M 2% /boot/efi
    overlay 94G 56G 34G 63% /var/lib/docker/overlay2/69b3ded2dc84bf7c7db6e035c95198eb03c91dd4a4fae1ddea31975a08e39dae/merged
    overlay 94G 56G 34G 63% /var/lib/docker/overlay2/6462388f84c6d1d957726ea219e6170f1258064ab1420481ce1a4a12ff8dbf56/merged
    overlay 94G 56G 34G 63% /var/lib/docker/overlay2/9eaf52937c42c61c397d96f76cdb7670b1f5ff6706c0760c96b22952d6cb2c1e/merged
    root@u2-virtual-machine:~#
  2. 查看原默认存储位置

    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
    root@u2-virtual-machine:/data# docker info
    Client:
    Version: 24.0.5
    Context: default
    Debug Mode: false

    Server:
    Containers: 3
    Running: 3
    Paused: 0
    Stopped: 0
    Images: 3
    Server Version: 24.0.5
    Storage Driver: overlay2
    Backing Filesystem: extfs
    Supports d_type: true
    Using metacopy: false
    Native Overlay Diff: true
    userxattr: false
    Logging Driver: json-file
    Cgroup Driver: systemd
    Cgroup Version: 2
    Plugins:
    Volume: local
    Network: bridge host ipvlan macvlan null overlay
    Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
    Swarm: inactive
    Runtimes: io.containerd.runc.v2 runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version:
    runc version:
    init version:
    Security Options:
    apparmor
    seccomp
    Profile: builtin
    cgroupns
    Kernel Version: 6.5.0-27-generic
    Operating System: Ubuntu 22.04.3 LTS
    OSType: linux
    Architecture: x86_64
    CPUs: 4
    Total Memory: 7.73GiB
    Name: u2-virtual-machine
    ID: 5a3077df-a687-4878-899c-e18abb96e761
    Docker Root Dir: /var/lib/docker # 原来默认存储位置
    Debug Mode: false
    Experimental: false
    Insecure Registries:
    127.0.0.0/8
    Registry Mirrors:
    https://q2gr04ke.mirror.aliyuncs.com/
    Live Restore Enabled: false

    root@u2-virtual-machine:/data#
  3. 创建新存储目录,并将原目录拷贝到新目录

    1
    2
    3
    root@u2-virtual-machine:~# cd /data/
    root@u2-virtual-machine:/data# mkdir docker
    root@u2-virtual-machine:/data# cp -ar /var/lib/docker/ /data/docker/
  4. 修改存储位置的配置文件

    1
    2
    3
    4
    5
    6
    7
    root@u2-virtual-machine:/data# vim /etc/docker/daemon.json 
    Press ENTER or type command to continue
    1 {
    2 "registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
    3 "data-root": "/data/docker/docker" # 添加此行
    4 }
    root@u2-virtual-machine:/data#
  5. 重启docker服务

    1
    2
    root@u2-virtual-machine:/data# systemctl daemon-reload
    root@u2-virtual-machine:/data# systemctl restart docker
  6. docker info查看存储位置,变成Docker Root Dir: /data/docker/docker了。

  7. 修改存储位置后,查看的信息如下
    修改存储位置后的信息

docker inspect jenkins | grep "/data/docker/docker" 查看验证
docker inspect查看容器信息验证

  1. 通过web访问jenkins、gitlab、gerrit均可正常访问和登录。

  2. 以上没问题后,可以将/var/lib/目录下的docker目录删除,然后将新目录创建软连接指向/var/lib/docker。

    1
    2
    3
    4
    5
    6
    7
    8
    root@u2-virtual-machine:~# cd /var/lib/
    root@u2-virtual-machine:/var/lib# mv docker docker.old
    root@u2-virtual-machine:/var/lib# ln -s /data/docker/docker /var/lib/docker
    root@u2-virtual-machine:/var/lib# ll -d docker
    lrwxrwxrwx 1 root root 19 5月 20 13:51 docker -> /data/docker/docker/
    root@u2-virtual-machine:/var/lib#

    root@u2-virtual-machine:/var/lib# systemctl restart docker

端口暴露

启动容器的时候,加参数-p 物理主机的端口:容器内的端口

1
2
$ docker run -d -p 8888:80 nginx:latest
# 访问物理主机的8888端口就可以访问到容器的80端口所对应的服务,即容器内的nginx

文件拷贝

1
2
3
4
5
$ docker cp 宿主机路径  容器ID或容器名:容器路径
# 将宿主机文件拷贝到容器中

$ docker cp 容器ID或容器名:容器路径 宿主机路径
# 将容器中文件拷贝到宿主机中

数据持久化

  1. volume
    镜像一旦启动成一个容器,会自动将容器内的/var/lib/mysql的数据持久化到本地来(/var/lib/docker/volumes/),但是都是一些很长的ID名,很容易混淆。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ mkdir -p /dockerdata/docker/volumes/dbtest

    $ docker run -d --name mysql2 -v dbtest:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.7
    # 启动一个叫做mysql2的容器,将容器内的/var/lib/mysql挂载到dbtest这个挂载点来
    $ docker volume ls
    # VOLUME NAME中就会有自定义的挂载点目录dbtest了

    # 验证
    $ docker exec -it 9b041a555d5d /bin/bash # 进入mysql容器
    $ mysql # 进入容器后进入mysql
    $ create database jay; # 创建数据库jay
    $ ll /dockerdata/docker/volumes/dbtest/_data
    # 查看数据在宿主机的持久化目录下会多出一个jay目录,说明数据持久化是没有问题的

    $ docker rm -f mysql2 # 模拟mysql2容器故障
    $ docker run -d --name mysql3 -v dbtest:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.7
    # 重启一个容器mysql3,使用mysql2原来的数据,进入mysql3中进行查看,原来创建的数据库jay还在
  2. bind mount
    通常是将物理主机的一个目录挂载到容器中。

    1
    2
    3
    4
    5
    6
    7
    8
    $ mkdir /webtest
    # 在宿主机创建一个目录/webtest,在/webtest目录下新建一个index.html文件
    $ echo "hello jay~" > /webtest/index.html

    $ docker run -d -v /webtest:/usr/share/nginx/html -pp 8118:80 nginx:latest
    # 启动一个nginx容器,将容器中的nginx的默认页映射到宿主机的/webtest目录;
    # 后期开发人员如果需要修改,直接在本地的/webtest目录操作即可,容器中的文件会进行同步;
    # 即nginx容器在读取代码的时候,实际就是读取的宿主机的/webtest目录下的代码

异常处理

  1. 创建容器时提示[Warning] IPv4 forwarding is disabled. Networking will not work.
    解决办法:
    1
    2
    3
    [root@localhost ~]# vi /usr/lib/sysctl.d/00-system.conf
    net.ipv4.ip_forward=1 # 添加此行
    [root@localhost ~]# systemctl restart network

课程中心

在线课程