[官网]https://www.docker.com/
[官方文档]https://docs.docker.com/

Docker 安装

基本组成

  • 镜像(image):
    相当于一个模板,通过镜像可以创建多个容器

  • 容器(container):
    Docker利用容器技术,独立运行一个或一组应用, 类似一个简单的Linux系统

  • 仓库(repository)
    存放镜像的地方

  1. 卸载旧版本的Docker

    1
    sudo apt-get remove docker docker-engine docker.io containerd runc
  2. 安装Docker Engine社区版

  • 使用存储库安装,在新主机上首次安装Docker Engine社区版之前,需要设置Docker存储库。运行以下命令添加Docker的官方GPG密钥:

    1
    bash`sudo apt-get update && sudo apt-get install ca-certificates curl gnupg`
  • 使用以下命令设置存储库:

    1
    2
    bash`echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg

  • 运行以下命令以安装Docker Engine社区版:

    1
    bash`sudo apt-get update && sudo apt-get install docker-engine`
  1. 设置镜像仓库:

    编辑文件 /etc/docker/daemon.json

    1
    2
    3
    4
    5
    {  
    "registry-mirrors": ["https://<your_acceleration_address>"]
    }

    #科大镜像源: https://docker.mirrors.ustc.edu.cn

    保存后重新启动Docker守护程序以应用新的配置:

    1
    2
    sudo systemctl daemon-reload  
    sudo systemctl restart docker
  2. 卸载Docker

  • 卸载 Docker Engine、CLI、containerd 和 Docker Compose 软件包:

    1
    sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
  • 主机上的映像、容器、卷或自定义配置文件 不会自动移除。要删除所有映像、容器和卷

    1
    2
    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd

常用命令

帮助命令

1
2
3
docker version      #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #帮助命令

镜像命令

  1. docker images
    • REPOSITORY (镜像的仓库源)
    • TAG
    • IMAGE ID
    • CREATED (创建时间)
    • SIZE
    • -a, --all 列出所有镜像
    • -q, --quiet 只显示镜像的id

  1. docker search

    1
    2
    3
    4
    5
    6
    7
    yuki@VM-4-3-ubuntu:~$ docker search mysql
    NAME DESCRIPTION STARS OFFICIAL AUTOMATED
    mysql MySQL is a widely used, open-source relation… 14447 [OK]
    mariadb MariaDB Server is a high performing open sou… 5513 [OK]
    phpmyadmin phpMyAdmin - A web interface for MySQL and M… 860 [OK]
    percona Percona Server is a fork of the MySQL relati… 619 [OK]
    bitnami/mysql Bitnami MySQL Docker Image 96

  2. docker pull

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # docker pull 镜像名[:tag]
    yuki@VM-4-3-ubuntu:~$ docker pull mysql
    Using default tag: latest # 如果不写 tag,默认就是latest
    latest: Pulling from library/mysql
    b193354265ba: Pull complete #分层下载,联合文件系统
    14a15c0bb358: Pull complete
    02da291ad1e4: Pull complete
    9a89a1d664ee: Pull complete
    a24ae6513051: Pull complete
    b85424247193: Pull complete
    9a240a3b3d51: Pull complete
    8bf57120f71f: Pull complete
    c64090e82a0b: Pull complete
    af7c7515d542: Pull complete
    Digest: sha256:c0455ac041844b5e65cd08571387fa5b50ab2a6179557fd938298cab13acf0dd
    Status: Downloaded newer image for mysql:latest
    docker.io/library/mysql:latest #真实地址

    # docker pull mysql
    # 等价于 docker pull docker.io/library/mysql:latest
    # 指定版本下载 docker pull mysql:5.7

  3. docker rmi + 镜像id
    删除镜像

  4. docker commit CONTAINER IMAGE_NAME:TAG :创建某个container的镜像
    以容器创建一个新的镜像时,该容器的原始镜像文件必须存在

    1
    docker commit -m="Message" -a="Author" CONTAINER  目标镜像名:[TAG]
  5. docker save -o ubuntu_20_04.tar ubuntu:20.04 : 将镜像ubuntu:20.04导出到本地文件ubuntu_20_04.tar

  6. docker load -i ubuntu_20_04.tar :将镜像ubuntu:20.04从本地文件ubuntu_20_04.tar中加载出来


容器命令

  1. docker rum + [arg] images 新建容器并启动

    • --name="Name" 容器名字
    • -d 后台方式运行 容器启动后 如果没有为前台进程提供服务则会自动停止
    • -it 使用交互方式运行
    • -p
      • -p ip:主机端口:容器端口
      • -p 主机端口:容器端口
      • -p 容器端口
    • -P 随机指定端口
  2. docker ps 列出所有当前正在运行的容器

    • -a 查看本地的所有容器

    • -q 只显示容器编号

  3. exit 退出容器并停止运行

  4. Ctrl + P + Q 退出容器并挂起

  5. docker rm + CONTAINER 删除容器

  6. docker start CONTAINER

  7. docker restart CONTAINER

  8. docker stop CONTAINER

  9. docker kill CONTAINER 强制停止当前容器

  10. docker top CONTAINER 查看容器中进程信息

  11. docker inspect CONTAINER 查看镜像的元数据

  12. docker exec -it CONTAINER bashShell 进入当前正在运行的容器

  • 进入容器后开启一个新的终端
    1
    2
    3
    yuki@VM-4-3-ubuntu:~$ docker exec -it cent /bin/bash
    [root@7f67c0db015f /]# ls
    bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
  1. docker attach CONTAINER 进入容器正在执行的终端

注意:

当使用docker exec退出容器时,容器会继续运行. 而当使用docker attach退出容器时,容器将会停止运行

docker cp CONTAINER: path destination 从容器内拷贝文件到主机上

  1. docker update CONTAINER --memory 500MB :修改容器限制

  2. docker rename CONTAINER1 CONTAINER2 :重命名容器

  3. docker stats :查看所有容器的统计信息,包括CPU、内存、存储、网络等信息

  4. docker export -o xxx.tar CONTAINER :将容器CONTAINER导出到本地文件xxx.tar中
    不需要容器的镜像文件存在

  5. docker import xxx.tar image_name:tag :将本地文件xxx.tar导入成镜像,并将镜像命名为image_name:tag

docker export/import与docker save/load的区别:
export/import会丢弃历史记录和元数据信息,仅保存容器当时的快照状态
save/load会保存完整记录,体积更大

部署nginx

1
2
docker pull nginx
docker run -d --name nginx01 -p 8000:80 nginx

容器数据卷

docker run -it -v Source : Destination

1
2
# $docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run -d -p 3333:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
  • -v 容器内路径 匿名挂在
  • -v 卷名:容器内路径 具名挂载
  • /宿主机路径 : 容器内路径 指定路径挂在

查看所有volume: docker volume ls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yuki@VM-4-3-ubuntu:~$ docker run -d -P --name nginx02 -v nginx-dir:/etc/nginx nginx
ce30488a1b26ce54315e059971b5f9911b9864aa7ef2a420736e07f8a556aab6
yuki@VM-4-3-ubuntu:~$ docker volume ls
DRIVER VOLUME NAME
local nginx-dir
yuki@VM-4-3-ubuntu:~$ docker volume inspect nginx-dir
[
{
"CreatedAt": "2023-09-16T14:34:24+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-dir/_data", #挂载点
"Name": "nginx-dir",
"Options": null,
"Scope": "local"
}
]

--volumes-from CONTAINERl 两个容器同步

1
docker run -it --name test01 --volumes-from  test centos

DockerFile

常用命令
FROM 指定基础镜像
AMINTAINER 维护者信息
RUN 构建时需要运行的命令
ADD 添加文件
WORKDIR 设置当前工作目录
VOLUME 挂载的目录
EXPOSE 指定对外的端口
CMD 启动容器时需要运行的命令,当有多个命令时只有最后一个命令会生效
ENTRYPOINT 可以追加命令
ONBUILD 触法指令 当构建一个被继承的 DockerFile时会运行
COPY 将文件 copy到镜像中
ENV 设置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM centos:7
MAINTAINER yuki<2935830170@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools


EXPOSE 80
CMD echo "---------end------------------"
CMD /bin/bash

docker build -f Dockerfile -t 镜像名:[tag] .


发布自己的镜像

DockerHub

DockerHub

  • docker login -u + username 登录账号
  • docker push
    1
    2
    3
    docker tag f040bc083d13 murasame01/nginx:1.0
    #发布前给自己的镜像加一个tag
    docker push murasame01/nginx:1.0

修改容器与宿主机的端口映射

  1. 通过修改配置文件修改

    • docker inspect CONTAINER | grep Id 查看完整的容器id
    • cd /var/lib/docker/containers 进入容器目录
    • docker stop CONTAINER 停止容器
    • systemctl stop docker 停止主机对docker的服务
    • 修改hostconfig.jsonconfig.v2.json
      • vi hostconfig.json
        1
        2
        3
        4
        5
        6
        如果之前没有端口映射, 在PortBindings下边添加以下内容,端口配置之间用英文字符逗号隔开:
        "PortBindings":{}
        增加一个映射, 这样写:
        "PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"60000"}]}
        前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口
        而修改现有端口映射更简单, 把端口号改掉就行。
      • config.v2.json
        找到ExposedPorts, 仿照之前内容添加端口映射
        1
        2
        举例:
        "ExposedPorts":{"80/tcp":{},"3306/tcp":{},"XXXX/tcp":{}} #注:这里写的都是容器内的端口
    • 重启 docker服务
      1
      2
      systemctl restart docker
      docker start CONTAINER
      注意!

      systemctl stop docker:这个命令会停止整个Docker守护进程1。这意味着所有由该守护进程管理的容器都会被停止,包括那些设置了自动重启策略的容器1。因此,当你需要修改hostconfig.json文件时,使用这个命令可以确保容器在修改过程中不会被自动重启1。
      docker stop 容器:这个命令只会停止一个特定的Docker容器2。如果该容器设置了自动重启策略,那么在你尝试修改hostconfig.json文件的过程中,容器可能会被自动重启2。这可能会导致你的修改无法生效,或者在修改过程中产生错误2。
      因此,当你需要修改Docker容器的hostconfig.json文件时,应该使用systemctl stop docker命令来确保所有容器都被正确地停止,从而避免在修改过程中出现问题。

  2. 把运行中的容器生成新的镜像,再新建容器

    • 提交一个运行中的容器为镜像
      1
      docker commit [containerid] [new_imagename]
    • 运行新建的镜像并添加端口映射
      1
      docker run -d -p 8000:80  [imagename] /bin/bash