Docker教程
- docker命令
- docker存储
- docker网络
- docker compose
- dockerfile
一、Docker架构:
- Docker Host(Docker主机):拥有docker环境的机器
- Docker Daemon:docker进程
- Client(docker-cli):提供命令行工具
docker pull mysql
:从应用市场下载
镜像docker run mysql
:运行镜像docker build xxx
:打包一个自己的镜像docker push xxx
:将打包好的镜像发布
到仓库- …
- Registry(应用市场)
- Images(镜像):市场里面的软件被称为镜像
- Containers(容器):用镜像启动的应用
- 容器特点:
- 容器类似轻量级vm
- 容器共享操作系统内核
- 容器拥有自己的文件系统、cpu、内存、进程空间
- 容器相互隔离
- 容器特点:
二、Docker安装
- Centos安装:https://docs.docker.com/engine/install/centos/
- 配置docker yum源
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装docker引擎(Install Docker Engine)
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 启动docker
sudo systemctl start docker
开机启动:
systemctl enable docker
- 配置docker加速
可去阿里云获取
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tqxirmbb.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
三、docker命令
1. 镜像操作
- 检索:搜索镜像
或者:docker hub:https://hub.docker.com/
docker search mysql
- 下载
# docker pull 镜像名
# 镜像名:标签/版本号
docker pull mysql
docker pull mysql:latest # latest是最新版
- 列表
docker images
# 完整写法
docker image ls
- 删除
docker rmi mysql:latest
# 批量删除
# docker ps -aq 查看所有容器id
# -f 强制删除
docker rm -f $(docker ps -aq)
2. 容器操作
2.1 基本操作
- 运行
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123 -d mysql:latest # 详细查看文档
- 查看
# 查看当前运行的容器
docker ps
# 查看所有容器
docker ps -a
- 停止
docker stop
- 启动
docker start mysql:latest
# mysql:latest 容器名称要对
# 也可以使用容器id启动(id前几位也行)
- 重启
docker restart mysql:latest
- 状态
docker stats mysql:latest
- 日志
docker logs mysql:latest
- 进入
docker exec mysql:latest
# -it 交互式访问 可使用ls等命令操作文件
# /bin/bash可以简写成bash
docker exec -it mysql:latest /bin/bash
使用exit
退出容器界面
root@9584a253fb38: exit
- 删除
# 使用删除前,需要将容器停掉
docker rm mysql:latest
# 强制删除
docker rm -f mysql:latest
2.2 docker run扩展
docker run [options] 容器名
options:
- -d, --detach:后台启动
- –name:给容器一个名称,不然会随机起名
- -p [外部端口]:[内部端口]:端口映射(外部端口不能重复,内部端口不同容器可以重复)
- -e:配置环境变量(多个变量需要分开写)
docker run -d --name mynginx -p 80:80 nginx
# 配置环境变量
docker run -d --name mynginx -p 80:80 -e xxx=xxx -e xxx2=xxx2 nginx
# --restart always 总是开机启动
docker run -d --restart always --name mynginx -p 80:80 nginx
3. 保存镜像
- 提交
# docker commit -m '提交信息' -a '作者' 容器名/id 镜像名:标签名/版本号
docker commit -m '提交信息' -a '作者' mynginx mynginx:v1.0
- 保存
# -o 输出文件
docker save -o mynginx.tar mynginx:v1.0
- 加载
加载镜像
docker load -i mynginx.tar
4. 分享镜像
- 登陆
docker login
- 命名
需要改名
# docker tag 原镜像名 新镜像名
# 新镜像名:docker hub用户名/镜像名
docker tag mynginx:v1.0 xiaotian/mynginx:v1.0
- 推送
docker push xiaotian/mynginx:v1.0
四、docker存储
掌握目录挂载、数据卷,让容器数据不再丢失
1. 目录挂载
挂载后外部、内部主机目录内容会同步
-v 外部主机目录:内部容器目录
例如:
docker run -d -p 80:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx:latest
2. 卷映射
启动前,外部目录以内部目录为准;启动后,两者同步。
-v 卷名:内部容器目录
例如:
# 两个-v
# -v /app/nghtml:/usr/share/nginx/html 目录挂载
# -v nginx_config:/etc/nginx 卷映射
docker run -d -p 88:80 -v /app/nghtml:/usr/share/nginx/html -v nginx_config:/etc/nginx --name app02 nginx:latest
容器映射到外部的卷,docker统一保存到/var/lib/docker/volumes/卷名
这个目录下(linux中)
- 查看创建的所有卷:
docker volume ls
- 创建卷:
docker volume create 卷名
- 查看卷配置:
docker volume inspect ngcong
五、docker网络
1. 使用ip访问
docker在启动时,会为每一个容器分配唯一ip,使用容器ip+容器端口(内部端口)
可以互相访问。
查看容器细节:
可以查看容器ip
docker container inspect 容器名
# 简写
docker inspect 容器名
容器1访问容器2:
# app1访问app2
docker exec -it app1 bash
curl http://app2ip地址+容器内部端口/资源目录
ip由于各种原因可能会变化,docker0
默认不支持主机域名,可以创建自定义网络,让容器名就是稳定的域名,就可以使用域名进行访问了。
2. 自定义网络,使用域名访问
- 创建自定义网络
docker network create mynet
- 列举网络
docker network ls
- 运行容器
需要加入自定义网络
--network 自定义网络名
docker run -d -p 88:80 --name app1 --network mynet nginx:latest
docker run -d -p 99:80 --name app2 --network mynet nginx:latest
- 访问其他容器
http://需要访问的容器名:内部域名
# app1访问app2
docker exec -it app1 bash
curl http://app2:80
六、docker compose
1. 介绍
docker compose:docker批量管理容器的工具
使用docker compose需要准备一个yaml
文件,可以在文件中配置启动的容器
-
上线:docker compose up -d(第一次)
-
下线:docker compose down
-
启动:docker compose start xxx1 xxx2 xxx3(指定启动某些容器)
-
停止:docker compose xxx1 xxx2
-
扩容:docker compose scale xxx2=3(复制3个相同的镜像)
2. 语法
文档:https://docs.docker.com/reference/compose-file/services/
compose.yaml
文件:
顶级元素:
- name:名字
- services:服务
- networks:网络
- volumes:卷
例如:
name: myblog
services:
mysql: #自定义名称
container_name: mysql # 自定义容器名称
image: mysql:latest
ports:
- "3306:3306"
# 数组写法(带短横线)
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=wordpress
volumes:
- mysql-data:/var/lib/mysql # 卷映射(使用卷映射需要在顶级元素volumes中将卷名声明一下)
- /app/mysql/myconf:/etc/mysql/conf.d # 目录挂载
restart: always # 总是开机重启
networks:
- blog # 在顶级元素也需要对网络进行声明
wordpress:
image: wordpress:latest
ports:
- "8080:80"
# key,value写法
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress-data:/var/www/html
restart: always
networks:
- blog
depends_on: # 启动顺序(wordpress启动前必须先启动mysql)
- mysql
volumes:
mysql-data: # 将卷名声明一下
wordpress-data:
networks:
blog:
启动编写的yaml文件:
# -f compose.yaml可以省略,默认启动compose.yaml
docker compose up -d
# -f 后面加具体的yaml名
docker compose -f compose.yaml up -d
3. 其他
- 下线
docker compose -f compose.yaml down
执行上面下线命令,卷数据没有被删除,如果想下线的时候,并删除镜像和卷可以执行下面代码:
# --rmi all/--rmi local 删除哪些镜像
# -v 删除卷
docker compose -f compose.yaml down --rmi all -v
七、docker dockerfile
dockerfile:用于构建自定义镜像
1. 制作镜像
常见指令:
- FROM:指定镜像基础环境
- RUN:运行自定义命令
- CMD:容器启动命令或参数
- LABEL:自定义标签
- EXPOSE:指定暴露端口(绑定端口)
- ENV:环境变量
- ADD:添加文件到镜像
- COPY:复制文件到镜像
- ENTRYPOINT:容器固定启动命令
- VOLUME:数据卷
- USER:指定用户和用户组
- WORKDIR:指定默认工作目录
- ARG:指定构建参数
例如:
- 配置Dockerfile文件:
FROM node:latest
LABEL author=xiaotian
# 指定暴露端口
EXPOSE 3000
# COPY 将本地文件拷贝到容器中
# ./dist/index.js本地文件 /main.js容器的根目录中
COPY ./dist/index.js /main.js
# 启动命令
# 写法一:
# ENTRYPOINT node /main.js
# 写法二:用数组代替空格
ENTRYPOINT ["node", "/main.js"]
- 制作镜像:
# -t/--tag:制作的镜像名称
# mynode_app:v1.0后面的.:表示构建的目录为当前目录
docker build -f Dockerfile -t mynode_app:v1.0 .
- 运行制作镜像的容器:
docker run -d -p 3000:8080 mynode_app:v1.0
2. 镜像分层存储机制
docker会共用一部分公共的镜像,例如有两个包含nginx镜像,而底层会共用一份。