Docker教程
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
-
配置加速镜像
-
修改一下docker 必须用sudo权限才能生效
https://blog.csdn.net/yudelian/article/details/105135694
其他系统请参考官方文档:
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: 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
1. 基础使用
常用命令:
文件内需要包含
- 基础环境
- 软件包
- 启动命令
比如:启动一个java 服务,建议将基础环境与代码软件分开,这里是写的所有,比较全,其实也可以直接用网上的镜像也是可以的
创建一个文件Dockerfile
# 步骤1: 从Ubuntu 24操作系统开始构建
FROM ubuntu:24.04
# 添加标签,可以设置用户名
LABEL maintainer="alex <alex@qq.com>"
# 步骤2: 修改镜像源为阿里镜像源
RUN mkdir -p /etc/apt/ \
&& echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" > /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list \
&& echo "deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list \
# 步骤3: 修改时间为亚洲上海时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
# 更新软件包列表
RUN apt update
# 步骤4: 安装中文语言包
RUN apt install -y language-pack-zh-hans \
&& locale-gen zh_CN.UTF-8 \
&& update-locale LANG=zh_CN.UTF-8
# 设置环境变量 ,这里必须设置,不然中文语言包不生效
ENV LANG=zh_CN.UTF-8
# 步骤5: 安装Java开发工具包(JDK)
RUN apt install -y openjdk-11-jdk
# 步骤6: 安装Maven
RUN apt install -y maven
RUN apt install -y vim
# 步骤8: 使用curl下载阿里云的Maven settings.xml并替换默认配置
# 请将下面的URL替换为阿里云官方提供的settings.xml文件的URL
# RUN mkdir -p /root/.m2 \
# && curl -o /root/.m2/settings.xml [阿里云官方settings.xml文件的URL]
# 将本地镜像源,copy到镜像中
COPY settings.xml /root/.m2/
# 清理缓存和不必要的文件
RUN apt clean \
&& rm -rf /var/lib/apt/lists/*
# 工作目录设置为/app
# WORKDIR /app
# 可选:将你的应用代码复制到工作目录
# COPY . /app
# 可选:暴露端口
# EXPOSE 8080
# 可选:运行你的应用
# CMD ["mvn", "命令"]
执行下面命令 将基础镜像打包成一个基础环境,不包含代码
docekr build -t ubuntu-jdk-11-base-env ./
引用基础镜像,然后继续将代码打包到镜像中
FROM ubuntu-jdk-11-base-env:latest
# 指定工作目录
WORKDIR /home/work
COPY . /home/work
RUN cd /home/work && mvn -B clean install -P${env} -Dmaven.test.skip=true -Dautoconfig.skip -pl springboot-server -am && cp -r springboot-server /target target
# 暴露端口
EXPOSE 8080
# 容器固定启动命令
# ENTRYPOINT ["/bin/bash"]
# 容器启动命令或参数 (拼接在 ENTRYPOINT 后面)
CMD java -Dfile.encoding=utf-8 -jar target/springboot-server .jar
全流程
# 从某一个基础镜像创建
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
参考项目如下:
https://gitee.com/alex-oos/DockerProject/tree/main/ubuntu-java-base
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://www.cnblogs.com/alex-oos/p/18442387