文章目录
展开环境准备
主机名 | ip | ip | 配置 |
---|---|---|---|
docker01 | 10.0.0.101 | 172.16.1.101 | 1h1g |
docker02 | 10.0.0.102 | 172.16.1.102 | 1h1g |
安装 Docker
使用清华源下载 dockerTP
# 下载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 镜像加速
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 镜像站
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
# 浏览器访问
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
# -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/* .
手动制作镜像
# 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;'
Comments | NOTHING