环境准备

主机名 ip ip 配置
docker01 10.0.0.101 172.16.1.101 1h1g
docker02 10.0.0.102 172.16.1.102 1h1g

安装 Docker

使用清华源下载 dockerTP

image-20230907174519439

image-20230907174628048

# 下载docker 官方源
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo  https://download.docker.com/linux/centos/docker-ce.repo

# 替换为清华源下载地址
[root@docker01 ~]# sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 下载docker
[root@docker01 ~]# yum install -y docker-ce docker-ce-cli containerd.io

# 查看docker客户端版本
[root@db01 ~]# docker version 
Client: Docker Engine - Community
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:35:25 2023
 OS/Arch:           linux/amd64
 Context:           default

# 启动docker服务端
[root@docker01 ~]# systemctl start docker

# 查看docker服务端版本
[root@docker01 ~]# docker version 
Client: Docker Engine - Community
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:35:25 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7
  Git commit:       1a79695
  Built:            Mon Sep  4 12:34:28 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.22
  GitCommit:        8165feabfdfe38c65b599c4993d227328c231fca
 runc:
  Version:          1.1.8
  GitCommit:        v1.1.8-0-g82f18fe
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

查看docker详细信息
[root@db01 ~]# docker info

配置 docker 镜像加速

image-20230907173950574

image-20230907174008216

image-20230907174133704

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://wonf909n.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

运行第一个容器

# 运行容器前
[root@docker01 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

## alpine是占容量最小的操作系统

# 使用docker运行容器alpine这个操作系统并打印"Hello World"
[root@docker01 ~]# docker run alpine /bin/echo "Hello World"
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
59bf1c3509f3: Pull complete 
Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300
Status: Downloaded newer image for alpine:latest
Hello World

# 运行容器后
[root@docker01 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
alpine       latest    c059bfaa849c   21 months ago   5.59MB

docker 镜像站

TP

docker 使用相关命令 – 镜像

# 拉镜像
镜像名称:镜像仓库名:标签
docker pull alpine:latest
当拉取镜像时不填写标签时会默认latest
## 拉取centos7镜像
[root@db01 ~]# docker pull centos:7

# 查看镜像
docker image ls
docker images

# 只查看所有镜像ID
docker images -q

# 搜索镜像
docker search 镜像名

# 删除镜像
docker rmi alpine:latest(镜像名:标签)\镜像ID

# 保存镜像
docker save alpine:latest -o /tmp/alpine_latest.tgz
docker save alpine:latest > /tmp/alpine_latest.tgz
docker save 镜像名:标签 -o /URL/镜像包

# 导入镜像
docker load -i /root/alpine_latest.tgz
docker load < /root/alpine_latest.tgz
docker load < 镜像包名

# 导出镜像
[root@docker01 ~]# docker save alpine:latest -o /tmp/alpine_latest.tgz
[root@docker01 ~]# scp /tmp/alpine_latest.tgz 172.16.1.102:/root
[root@docker02 ~]# docker load < /root/alpine_latest.tgz 
[root@docker02 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
alpine       latest    c059bfaa849c   21 months ago   5.59MB

# 打标签
docker tag imageID 新镜像名:新标签

docker 使用相关命令 – 容器

# 查看所有容器
docker ps -a

# 只查看所有容器ID
docker ps -a -q

# 查看正在运行的容器
docker ps

# 删除容器
docker rm 容器名\容器ID

# 快捷删除容器
docker rm $(docker ps -a -q)

# 停止容器(需要运行过的容器)
docker stop 容器ID

# 启动容器(需要运行过的容器)
docker start 容器ID

# 把容器的bash放在后台运行(第一次启动容器)
docker run -it -d 镜像名:标签 bash 

# 进入容器的bash
docker exec -it 容器ID bash

容器名词解析

# 查询容器进程
[root@web01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
10b069b91955   ubuntu    "bash"    8 seconds ago   Up 7 seconds             busy_lalande

CONTAINER ID # docker ID
IMAGE # 镜像名
COMMAND # 守护进程命令
CREATED # 创建的时间点
STATUS # 运行时长
PORTS # 端口状态
NAMES # 容器名

docker为何会启动就退出容器

原因:docker容器中,pid为1的进程结束了

1)一个容器只做一件事
2)如果想让docker持续运行,必须将pid为1的进程在前台运行
3)在docker run时结尾加上命令,则可以修改docker运行时pid为1的进程
docker inspect 看一切详细信息

docker容器操作

docker run选项 作用
-d 将容器放在后台运行
--name 指定容器的名称
-i 使用交互模式input
-t 为容器提供一个终端tty
--rm 容器退出自动删除
--restart always 设置容器在宿主机开机时自动启动
-p 端口映射
-P 随机端口映射
-v 映射数据卷
docker  ps     查看容器列表  -a 查看所有容器
docker  run 创建并运行容器
     例子:docker run  -d -it -p 80:80  nginx:latest
docker create  创建容器 --name
docker start   启动容器
docker  stop   停止容器
docker  restart 重启容器
docker  kill   强制停止容器
docker  rm     删除容器
    批量删除所有容器 docker rm -f `docker ps -a -q`
docker  exec   进入正在运行的容器(分配一个新终端)
       例子: docker exec  -it  容器id/容器名字   /bin/bash(/bin/sh)
docker attach  进入正在运行的容器(使用相同的终端),偷偷离开的快捷键ctrl +p,ctrl +q

## docker设计理念:
# 1.一个容器内最好只做一件事
# 2.容器运行的前提条件是进程号PID为1的进程不退出

*** docker run -d -p 80:80 nginx:latest  
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v  源地址(宿主机):目标地址(容器)
nginx docker镜像的名字

docker run -it --name centos6 centos:6.9 /bin/bash
-it   分配交互式的终端interactive tty
--name 指定容器的名字
/bin/sh覆盖容器的初始命令

运行容器
    docker run image_name   

    docker run ==== docker create  + docker start
启动容器
    docker start
停止容器
    docker stop CONTAINER_ID
杀死容器
    docker kill container_name
查看容器列表
    docker ps(-a -l -q)

进入正在运行的容器(目的,调试,排错)
*** docker exec  (会分配一个新的终端tty)
    docker exec -it  容器id或容器名字 /bin/bash(/bin/sh)   
    docker attach(使用同一个终端)  偷偷离开的快捷键ctrl+p,ctrl+q
    docker attach [OPTIONS] CONTAINER

删除容器
    docker rm
批量删除容器
    docker rm -f `docker ps -a -q`

docker 容器端口映射

## 先查看声明了哪些端口
[root@docker01 ~]# docker inspect nginx:alpine
"ExposedPorts": {
"80/tcp": {} ## 仅仅只是一个声明,并不代表只能映射80
}

指定映射(docker 会自动添加一条iptables规则来实现端口映射)
   -p hostPort:containerPort
   -p ip:hostPort:containerPort  多个容器都想使用81端口
   -p ip::containerPort(随机端口)
   -p hostPort:containerPort/udp
   -p  10.0.0.100::53/udp   使用宿主机的10.0.0.100这个ip地址的随机端口的udp协议映射容器的udp53端口
   -p 81:80 –p 443:443 可以指定多个-p

docker run
# 指定端口映射
[root@docker01 ~]# docker run --name web11 -p 8088:80 -d nginx:alpine
-p  宿主机端口:容器端口  (最常用的写法)

# 指定IP和端口映射
[root@docker01 ~]# docker run --name web13 -p 172.16.1.101:80:80 -d nginx:alpine
[root@docker01 ~]# docker run --name web13 -p 10.0.0.101:80:80 -d nginx:alpine
-p  宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口)

# 随机端口映射
[root@docker01 ~]# docker run --name web14 -P -d nginx:alpine
[root@docker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                     NAMES
35bc039daf8a   nginx:alpine   "/docker-entrypoint.…"   31 seconds ago   Up 30 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp   web14
-P(大写的) 自动随机端口映射

[root@docker01 ~]# docker run --name web15 -p 10.0.0.101::80 -d nginx:alpine
-p  宿主机ip1::容器端口   随机端口映射

-p  宿主机ip1::容器端口/udp   使用udp协议做随机端口映射
-p 80:80  -p 3306:3306
-p 1111-1119:1111-1119  端口范围映射

通过iptables来实现的端口映射

docker inspect 可以查看容器内部的详细信息

docker容器文件传输(lrzsz)

## 塞进去
docker cp 包名 [container ID|container name]:路径

## 抽出来
docker cp  [container ID|container name]:路径/包名 /路径

使用docker运行nginx做小游戏

[root@docker01 ~]# docker run --name web01 -p80:80 -d nginx:alpine
2e83cd3aa10f6cd0d015c36976435802eb46e4f1f39186f81a41e7499da4b0a2
[root@docker01 ~]# docker cp h5_games.zip web01:/
Successfully copied 19.3MB to web01:/
[root@docker01 ~]# docker exec -it web01 /bin/sh
/ # vi /etc/nginx/conf.d/1_h5.conf
server{
        listen 80;
        server_name _;
        root /code;
        index index.html;
}
/ # unzip h5_games.zip -d /root
/ # rm -fr /etc/nginx/conf.d/default.conf 
/ # cd /root/h5_games/
~/h5_games # mkdir /code 
~/h5_games # mv ./* /code/
~/h5_games # nginx -s reload
# 浏览器访问

image-20230908163634731

docker容器目录映射

docker run
-v  宿主机绝对目录:容器目录
-v  容器目录        #创建一个随机卷,来持久化容器的目录下的数据,适合保存变化的数据
-v  卷名:容器目录    #创建一个固定名字的卷,来持久化容器的目录下的数据,适合数据共享
--volumes-from  跟某一个容器挂载所有相同的卷

# -v 宿主机目录:容器目录
[root@docker01 ~]# docker run -p 90:80 -v /root/h5_games:/usr/share/nginx/html -d nginx:alpine
cea9a19591c1700a9d79085143cb4e65feb09458ec54e1ea8f4a25c1f010c9e9

image-20230908163827573

# -v 容器目录(宿主机上随机目录)
[root@docker01 ~]# docker run -p 100:80 -v /usr/share/nginx/html -d nginx:alpine
dfb61b191c24824f6ed9fb3bfff14821b31e72ff5b46d2ceed1538b9969f332b

[root@docker01 ~]# docker inspect dfb61b191c24824f6ed9fb3bfff14821b31e72ff5b46d2ceed1538b9969f332b
/var/lib/docker/volumes/6a87bf6f8b929c0389ae869e5b517489b0c0da19610f95cd5625fd1368d49c9d/_data

[root@docker01 ~]# cd /var/lib/docker/volumes/6a87bf6f8b929c0389ae869e5b517489b0c0da19610f95cd5625fd1368d49c9d/_data
[root@docker01 _data]# ll
total 8
-rw-r--r-- 1 root root 497 Dec 29  2021 50x.html
-rw-r--r-- 1 root root 615 Dec 29  2021 index.html

[root@docker01 _data]# mv /root/h5_games/* .

image-20230908164411010

image-20230908164620465

手动制作镜像

# 1.首先要启动一个基础镜像
[root@docker01 _data]# docker run -it centos:7 /bin/bash
# 2.换源
bash <(curl -sSL https://linuxmirrors.cn/main.sh)
# 3.安装nginx
[root@448571c63be8 /]# yum install -y nginx unzip
# 4.写配置文件
[root@448571c63be8 /]# vi /etc/nginx/conf.d/h5.conf
server{
listen 80;
server_name _;
root /code;
index index.html;
}
# 5.创建code目录
[root@448571c63be8 /]# mkdir /code
# 6.拷贝代码
[root@docker01 ~]# docker cp /opt/h5_games.zip 448571c63be8:/code
# 7.部署代码
[root@448571c63be8 code]# unzip h5_games.zip
[root@448571c63be8 code]# mv h5_games/* .
# 8.将容器打成镜像
[root@docker01 ~]# docker commit 448571c63be8 nginx_h5:v1
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_h5 v1 f0e61dc263cc 11 seconds ago 912MB
# 9.导出镜像
[root@docker01 _data]# docker save nginx_h5:v1 > /tmp/h5.tgz
# 10.拷贝镜像
[root@docker01 _data]# scp /tmp/h5.tgz 172.16.1.102:/tmp
# 11.导入镜像
[root@docker02 ~]# docker load < /tmp/h5.tgz
# 12.启动
[root@docker02 ~]# docker run -p 80:80 -d nginx_h5:v1 /sbin/nginx -g 'daemon off;'