- Docker 教程
- 一、基础:安装Docker
- 二、命令
- 1. 命令:镜像操作
- 2. 命令:容器操作
- 3. 命令:run 细节
- 4.命令:保存镜像
- 5. 命令:分享镜像
- 三、存储
- 1. 存储:目录挂载
- 2. 存储:卷映射
- 四、网络
- 1. 默认网络是docker0
- 2. 网络-自定义网络
- 3. 网络-redis主从集群
- 五、Docker compose
- 六、DockerFile
- 1. 基础使用
- 2. 镜像分层机制
Docker 教程
简单介绍:
一、基础:安装Docker
用ubuntu 系统来做演示
- 删除系统里面原有的镜像
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
- 设置 Docker 的
apt
存储库。
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc# Add the repository to Apt sources:
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
- 安装 Docker 包命令
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 安装完毕,设置开机启动
sudo systemctl enable docker
-
配置加速镜像
https://www.cnblogs.com/alex-oos/p/18417200
其他系统请参考官方文档:
https://docs.docker.com/engine/install
二、命令
1. 命令:镜像操作
-
docker search 检索+,名称,一般可以搜索出来各种版本的镜像,带office 的名称就是官方的镜像,其他的很有可能就是个人的
docker search nginx
-
docker pull 下载
#docker 拉取镜像,镜像名+版本号,默认拉取的是latest版本 docker pull nginx:latest
-
docker images 查看本地镜像列表
docker images
-
docker rmi 删除镜像
删除的时候,可以使用唯一id,也可以使用镜像名,如果镜像被占用就删除不了
docker rmi nginx
2. 命令:容器操作
-
运行docker run
docker run + 镜像名
docker run -d --name=mynginx nginx
- docker ps 查看此刻所有运行的容器
docker ps # 查看所有容器
docker ps -a
# 过滤中你想要的容器名称
docker ps -a | grep '容器名'
- docekr stop 停止 +容器名/容器id
docker stop mynginx
docker stop 95c7e10581f3
- docker start 启动 +容器名/容器id
docker start mynginx
docker start 95c7e10581f3
- docker restart 重启 +容器名/容器id
docker restart mynginx
docker restart 95c7e10581f3
-
docker stats 状态+容器名/容器id
查看cpu,内容,占用率
docker stats mynginx
docker stats 95c7e10581f3
- docker logs 日志 ++容器名/容器id
docker logs mynginx
-
docker exec 进入容器
-it 交互式进入
/bin/bash 用bash的启动指令
#docker exec -it +容器名称/容器id /bin/bash
docker exec -it mynginx /bin/bash
-
docekr rm 删除 +容器名/容器id
注意:如果容器处于运行状态无法删除,先停止容器运行,在进行删除操作,强制-f 不推荐使用,仅仅知道即可
docker rm mynginx
docker rm 95c7e10581f3
#强制
docker rm -f mynginx
3. 命令:run 细节
docker run +镜像名
- -d 后台运行
docekr run -d nginx
- --name +容器名 +镜像名
docker run --name=mynginx nginx:latest
- -p 端口映射 本机端口:容器端口
docker run -p 80:80 --name=mynginx nginx:latest
4.命令:保存镜像
- docker commit 提交容器,将容器提交一下
docker commit -m '注释' 容器名
- docker save 将镜像保存为一个文件
#docker save -o +文件名 + 镜像
docker save -o 'mynginx.tar' nginx
- docker load 将文件加载为一个镜像
# docker 加载文件
docker load -i mynginx.tar
5. 命令:分享镜像
docekr hub 地址:https://hub.docker.com/
介绍:docker hub 其实主要是用于存储docekr镜像的地方,类似于github,首先需要注册一下,然后将对应的镜像给push上去
docker login 登录 输入你的账号与密码,即将登录成功
docker login
docker tag 设置标签
docker tag [OPTIONS] IMAGE [NAME[:TAG]]
IMAGE
:要打标签的镜像的 ID 或名称。[NAME[:TAG]]
:新的标签名称,其中NAME
是仓库的名称,TAG
是标签。
demo:
一般做的时候,做一个指定版本,在做一个最新版本的,这样子方便别人拉取到最新版本的
# 设置标签
docker tag mynginx:v1 alexoos/nginx:v1
# 设置完查看一下镜像
docker images
docker tag mynginx:v1 alexoos/nginx:latest
docker push 推送 + 镜像名称
docker push alexoos/nginx:latest
三、存储
docker ps -aq 打印所有的容器id
# 打印所有容器的id
docker ps -aq
# 批量删除所有未运行的容器
docker rm $(docker ps -aq)
1. 存储:目录挂载
命令: -v 目录挂载 本地目录:容器目录
目录挂载主要是以外面的文件夹为准,如果目录挂载时外面的文件夹,没有文件,那么里面的也没有文件
如果本地目录不存在,会自动进行创建目录
docker run -d -p 81:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx
目录挂载的作用:
-
容器内将内容修改后,会自动同步到本地目录,一劳永逸的方式
-
将数据持久化,不担心数据会丢失,容器丢失,数据仍然存在
2. 存储:卷映射
-v 卷映射 -v ngconf:/etc/nginx
卷映射:是以容器内部的文件夹为准,第一次启动,内部有数据,将内部的数据映射到外部
应用范围:
- 用于配置挂载
- 用于本地不存在,但是容器启动又必须读取的配置
# -v 卷名:容器目录
-v ngconf:/etc/nginx
# 启动容器,使用目录挂载,卷映射,如果卷不存在,就自动创建
docker run -d -p 99:80 -v /app/nghtml:/usr/share/nginx/html -v ngconf:/etc/nginx --name app02 nginx
# 卷目录的默认路径
/var/lib/docker/volumes/<volume-name>
# 列出所有的卷
docker volume ls
# 查看某个卷的详细信息
docker volume inspect ngconf (卷名)
四、网络
介绍:
分为默认网络与自定义网络
1. 默认网络是docker0
查看默认网络:ip a ,找到docker0 发现 inet 为 172.17.0.1/16 ,这个一般都是默认网络
docker 一般每启动一个容器,默认会给容器一个ip地址,直接访问容器内的数据,可以使用容器ip+容器端口互相访问
查看容器的ip的相关命令
# 启动一个容器
docker run -d -p 8011:80 --name app01 nginx
# docker inspect + 容器名,直接看network,network 下面有相关的ip地址,一般是172.17.0.1 这个网段
docker inspect app01
2. 网络-自定义网络
自定义网络:其实就是为了方便A容器与B容器直接访问,因为ip 容易发生改变,所以自定义开辟一个网络,这样子用容器名+端口互相访问,更加高效与便捷
# 自定义网络相关命令 先输入--help 方便查看如何使用
docker network --help
docker network create mynet
自定义网络的网段一般是:172.22.0.1
启动容器的时候,加入 --network 参数即可
启动的容器就加入了自定义网络了
docker run -d -p 88:80 --name app01 --network mynet nginx
docker run -d -p 88:80 --name app02 --network mynet nginx
#访问的时候,直接用容器名+端口即可
设置完毕之后,两个容器内相互访问直接用 curl http://app01:80 直接就访问成功了,只有在容器内相互访问才可以,在容器外访问不行
如果想设置都可以访问,建议使用自定义网络,设置自定义网段 +固定ip地址,这样子才可以,参考项目为:
https://gitee.com/alex-oos/kinit/blob/master/docker-compose.yml 这个设置的相对标准一些
3. 网络-redis主从集群
先不补充,后期补充,
五、Docker compose
介绍:
批量管理容器的工具
首先需要准备一个docker-compose.yml 文件
常用的命令如下:
#上线 (启动并且创建所有容器)
docker-compose up -d
# 重启所有容器
docker-compose restart# 停止所有容器 下线
docker-compose down# 查看所有容器状态
docker-compose ps -a
# 启动单个容器
docker-compose start x1 x2 x3
# 停止多个容器
docker-compose stop x1 x2 x3
# 扩容容器 扩容 x 2=3 代表 x2容器启动3个
docker compose scale x2=3
举例 :需要安装 wordpress
正常安装步骤
-
创建网络 blog
docker network create blog
-
创建容器mysql
docker run --name wordpress-db -e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_DATABASE=wordpress --network wordpress-net -d mysql:8.0
-
创建容器 wordpress
docker run --name wordpress -e WORDPRESS_DB_PASSWORD=yourpassword -e WORDPRESS_DB_HOST=wordpress-db:3306 -p 80:80 --network wordpress-net -d wordpress
使用 docker-compose,一个文件即可
创建一个docker-compse.yml 文件,文件如下
name: myblog
services:mysql:# 容器名 container_name: mysql# 镜像image: mysql:8.0# 端口ports:- "3306:3306"# 环境变量environment:- MYSQL_ROOT_PASSWORD=123456- MYSQL_DATABASE=wordpress# 挂载卷volumes:# 卷映射- mysql-data:/var/lib/mysql# 目录挂载- /app/mysql/conf.d:/etc/mysql/conf.d# 自动重启restart: always# 网络networks:blog_network:ipv4_address: "177.8.0.2"wordpress:container_name: wordpressimage: wordpress:latestports:- "9011:80"environment:WORDPRESS_DB_HOST: mysqlWORDPRESS_DB_NAME: wordpressWORDPRESS_DB_USER: rootWORDPRESS_DB_PASSWORD: 123456volumes:- wordpress:/var/www/htmlrestart: alwaysnetworks:blog_network:ipv4_address: "177.8.0.3"depends_on:- mysql# 持久化存储卷
volumes:mysql-data:wordpress:networks:blog_network:driver: bridgeipam:driver: defaultconfig:- subnet: "177.8.0.0/16"gateway: "177.8.0.1"
进入到文件下,执行下面命令
docker-compse up -d
六、DockerFile
1. 基础使用
常用命令:
文件内需要包含
- 基础环境
- 软件包
- 启动命令
比如:启动一个java 服务,建议将基础环境与代码软件分开,这里是写的所有,比较全,其实也可以直接用网上的镜像也是可以的
创建一个文件Dockerfile
# 从某一个基础镜像创建
FROM Ubuntu:20.04
# 添加标签,可以设置用户名
Label author="Alex"
# 指定工作目录
WORKDIR /home/work
COPY . /home/work# 安装基础环境,jdk,mavn ,git
RUN apt-get update && apt-get install -y openjdk-11-jdk && apt-get install -y maven && apt-get install -y git# 构建指定参数
ARG env# 运行自定义命令
RUN cd /home/work && mvn -B clean install -P${env} -Dmaven.test.skip=true -Dautoconfig.skip -pl semi-automatic-migration-server -am && cp -r semi-automatic-migration-server/target target# 暴露端口
EXPOSE 8080# 容器固定启动命令
ENTRYPOINT ["/bin/bash"]# 容器启动命令或参数 (拼接在 ENTRYPOINT 后面)
CMD java -Dfile.encoding=utf-8 -jar target/semi-automatic-migration-server.jar
docker 构建命令如下:
# docker build --build-arg env=环境 -t 镜像名 . (点是当前目录的意思)
docker build --build-arg env=test -t demo1 .
docker build 参数
--build -arg 参数构建传递
-t 镜像名
--file +文件名 指定文件,如果不在当前目录下,或文件名不为Dockerfile 就需要这个参数
2. 镜像分层机制
基础环境做第一层,代码做第二层,一般都是这样子使用即可
参考文档:
视频资料地址:
https://www.bilibili.com/video/BV1Zn4y1X7AZ?p=1&vd_source=e33a356475cf6a18a9f6345f4e44a209
Docker官方文档(英文版)
https://docs.docker.com/get-started/
https://docs.docker.com/engine/reference/builder/
优秀blog(中文版)
https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://chinese.freecodecamp.org/news/the-docker-handbook/