Docker教程
目录
Docker 教程
一、基础:安装Docker
二、命令
- 命令:镜像操作
- 命令:容器操作
- 命令:run 细节
4.命令:保存镜像 - 命令:分享镜像
三、存储 - 存储:目录挂载
- 存储:卷映射
四、网络 - 默认网络是docker0
- 网络-自定义网络
- 网络-redis主从集群
五、Docker compose
六、DockerFile - 基础使用
- 镜像分层机制
Docker 教程
简单介绍:
image-20240930190525374
一、基础:安装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
二、命令#
- 命令:镜像操作#
image-20240930193155629
docker search 检索+,名称,一般可以搜索出来各种版本的镜像,带office 的名称就是官方的镜像,其他的很有可能就是个人的
docker search nginx
image-20240930191801393
docker pull 下载
docker 拉取镜像,镜像名+版本号,默认拉取的是latest版本
docker pull nginx:latest
image-20240930192436708
docker images 查看本地镜像列表
docker images
image-20240930192712982
docker rmi 删除镜像
删除的时候,可以使用唯一id,也可以使用镜像名,如果镜像被占用就删除不了
docker rmi nginx
image-20240930192752612
- 命令:容器操作#
image-20240930193239892
运行docker run
docker run + 镜像名
docker run -d --name=mynginx nginx
image-20240930194156684
docker ps 查看此刻所有运行的容器
docker ps
查看所有容器
docker ps -a
过滤中你想要的容器名称
docker ps -a | grep '容器名'
image-20240930194334625
docekr stop 停止 +容器名/容器id
docker stop mynginx
docker stop 95c7e10581f3
image-20240930194525624
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
image-20240930194815752
docker logs 日志 ++容器名/容器id
docker logs mynginx
image-20240930194937610
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
- 命令: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.命令:保存镜像#
image-20240930200825714
docker commit 提交容器,将容器提交一下
docker commit -m '注释' 容器名
docker save 将镜像保存为一个文件
docker save -o +文件名 + 镜像
docker save -o 'mynginx.tar' nginx
docker load 将文件加载为一个镜像
docker 加载文件
docker load -i mynginx.tar
- 命令:分享镜像#
image-20240930201112946
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)
- 存储:目录挂载#
命令: -v 目录挂载 本地目录:容器目录
目录挂载主要是以外面的文件夹为准,如果目录挂载时外面的文件夹,没有文件,那么里面的也没有文件
如果本地目录不存在,会自动进行创建目录
docker run -d -p 81:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx
目录挂载的作用:
容器内将内容修改后,会自动同步到本地目录,一劳永逸的方式
将数据持久化,不担心数据会丢失,容器丢失,数据仍然存在
- 存储:卷映射#
-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/
列出所有的卷
docker volume ls
查看某个卷的详细信息
docker volume inspect ngconf (卷名)
四、网络#
介绍:
分为默认网络与自定义网络
- 默认网络是docker0#
查看默认网络:ip a ,找到docker0 发现 inet 为 172.17.0.1/16 ,这个一般都是默认网络
image-20241010152227138
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
image-20241010152113231
- 网络-自定义网络#
自定义网络:其实就是为了方便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 这个设置的相对标准一些
- 网络-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: wordpress
image: wordpress:latest
ports:
- "9011:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
volumes:
- wordpress:/var/www/html
restart: always
networks:
blog_network:
ipv4_address: "177.8.0.3"
depends_on:
- mysql
持久化存储卷
volumes:
mysql-data:
wordpress:
networks:
blog_network:
driver: bridge
ipam:
driver: default
config:
- subnet: "177.8.0.0/16"
gateway: "177.8.0.1"
进入到文件下,执行下面命令
docker-compse up -d
六、DockerFile#
- 基础使用#
常用命令:
image-20241010181706036
文件内需要包含
基础环境
软件包
启动命令
比如:启动一个java 服务,建议将基础环境与代码软件分开,这里是写的所有,比较全,其实也可以直接用网上的镜像也是可以的
创建一个文件Dockerfile
[kod.new-youths.com)
[kod.papadcj.com)
[kod.xp1489.com)
[kod.roycues.com)
[kod.rockiesenglish.com)
[kod.cvdds.com)
[kod.itdsm.com)
[kod.xjxqd.com)
从某一个基础镜像创建
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 就需要这个参数
- 镜像分层机制#
基础环境做第一层,代码做第二层,一般都是这样子使用即可
image-20241010184544175