docker
1. 概念
- Image 镜像
内置了某个应用程序的OS。
- Container 容器
运行者某个应用程序的一个简化linux系统。
一个tomcat镜像-》run->可以创建多个容器01,02,最终项目运行在容器中。独立运行一个或一组应用,通过镜像创建。
启动、停止、删除等命令。
- Repository 仓库
用来放镜像的,分公有仓库、私有仓库。类似gitee,maven,docker官方的是全球共有的远程中央仓库,自己账号下可管理自己推送的仓库镜像
2. 乌班图2204安装
亲测成功,照着一步步执行:
# 升级 apt
sudo apt update
# 安装docker
sudo apt install docker.io docker-compose
# 将当前用户加入 docker组
sudo usermod -aG docker ${USER}
# 测试一下
docker ps -a
docker run hello-world
3. wsl安装
win先通过wsl安装ubuntu, 先保证是64位
-
查看ubuntu系统是32位的还是64位的:getconf LONG_BIT
-
查看操作系统架构:uname -a
-
检查是否已经安装docker: docker --version
-
卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc -
添加Docker官方GPG key
国内阿里云版 sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - -
验证key的指纹
sudo apt-key fingerprint 0EBFCD88 -
正常会显示:
-
添加仓库(阿里云版):
点击查看代码
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
- sudo apt-get update
- 安装最新版本的docker ce和containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io - 验证:docker --version
4. 云服务器安装
官网文档有
1:粘贴命令:sudo yum install -y yum-utils
后面2,3,4命令用一行执行
2:粘贴命令:yum-config-manager
3:粘贴命令:--add-repo
4:粘贴命令:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
成功提示:
上面三条执行成功,再执行下面
5:下载:yum install -y docker-ce
5. 启动docker
5.1. 配置国内镜像
5.1.1. 阿里镜像
需要有阿里云账号,或者阿里云服务器
阿里每个人的加速地址都不一样。
找不到的话,可以全局搜索:镜像加速器
-
如果用yum方式配置失败,可用json方式
-
json方式
5.1.2. 改为国内镜像
cat /etc/docker/daemon.json
vi /etc/docker/daemon.json
1:修改镜像源
json文件内容
{
"registry-mirrors":["https://docker.m.daocloud.io","https://docker.lpanel.live"]
}
2: 重新加载配置文件
sudo systemctl daemon-reload
3:重启docker
sudo systemctl restart docker
6. 命令
官方文档地址:
https://docs.docker.com/reference/
// 信息
docker info
// 命令字典
docker --help
6.1. 镜像命令
6.1.1. 导入导出
// 导出镜像到磁盘tar包
// /tmp/docker/erlang.tar 磁盘位置
// docker save -o 命令
// erlang REPOSITORY名称
// 25.2: TAG
docker save -o /tmp/docker/erlang.tar erlang:25.2
// 导入镜像(在当前目录下)
docker load -i edge.tar
// 所有已安装镜像
docker images
// 通过id删除镜像
docker rmi -f f2ad9f23df82
// 删除所有未启动的镜像
docker rmi -f $(docker images -aq)
// 查看该镜像的版本号
docker image inspect mongo:latest|grep -i version
6.1.2. 提交镜像到自己仓库下
1:去dockerhub注册自己账号,地址:https://hub.docker.com/
2:shell客户端,docker login -u 用户名密码登录
登录成功,会提示/root/.docker目录下生成config.json文件
3:将镜像列表中的镜像 打上tag, 必须已本账号开头
6.2. 容器命令
-
ps 正在运行的容器实例
-
dokcer logs -f -t --tail [条数] 容器id #容器日志
-
docker inspect 容器id # 容器的详细信息
// 根据容器id删除容器
docker rm -f cc01f379fa16 -
拉取
// 拉取镜像指定版本(tag)
docker pull centos:centos6 -
启动容器
// 第一次创建并启动
// -p -v 前面是宿主机,冒号:后面是容器的
docker run -d --name nginx2 -p 80:80 ae893c58d83f
-
重启
// 停掉后重起(不管是否已经启动,没起则起,起了就重启)
docker restart 容器id -
停掉容器
docker stop 94193e4ce731 // 容器id -
开启容器
// 针对stop以后,想重新启动
docker start 容器id -
进入容器
docker exec -it 69356f406e7d /bin/bash -
退出容器
exit -
cp 拷贝
可以把容器里面的文件拷贝到宿主机。
也可以把宿主机的文件拷贝到容器里面。
6.3. 数据卷挂载
// 将前面的宿主机的/root目录,挂载到容器的/root里
// 默认是rw 可读可写,ro 只读
- 关键字
-v /root:/root
容器的哪些文件应该挂载到宿主机,并且在哪个位置?
dockerHub官方一般有介绍;或者查看dockerfile - 列出所有数据卷
docker volume ls - 查看数据卷信息
docker volume inspect NAME的值 - 创建数据卷
docker volume create 数据卷名称
7. 常见问题
- 拉去镜像超时(pull)
- 一般是拉去最新版本,国外拉去缓慢。
- 解决:换个低版本,再换国内镜像
8. 安装常用软件
8.1. mysql
docker run -d --name 容器名 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 镜像id前4位
8.2. nginx
容器内,默认配置文件地址
etc/nginx/conf.d/default.conf
需要手动修改配置文件,端口号才不是80
// 将文件从docker中拷贝到宿主机
docker cp nginx名称:/etc/nginx/default.conf /home/(宿主机文件目录)
// 改了配置文件后,拷回容器
docker cp /home/default.conf nginx:/etc/nginx/conf.d/
8.3. redis
亲测有效!
以华为云为例:详情见:https://www.cnblogs.com/123456QWErty/p/16548086.html
== 核心一步==
// --appendonly yes 代表用aof持久化
docker run -p 6379:6379 --name redis -v /home/docker/redis/data:/data -d --restart=always redis:latest redis-server --appendonly yes --requirepass "micro2022@"
9. Dockerfile
- 作用
用来制作镜像的。
9.1. 语法
- 固定第一行
固定写FROM - 大小写
不区分,但习惯为大写 - 注释符号
是 #
9.2. 命令
9.2.1. build 构建镜像
// . 代表执行此命令时,命令和Dockerfile在同一个目录
// -f 不是Dockerfile时需要传,Dockerfile可以不传
// -t 是tag的缩写,后面跟的是你取的镜像名
// 在当前目录找aa文件来执行
docker build . -f aa -t 容器名:版本号
// 在当前目录找Dockerfile文件
docker build . -t my_nginx:v2.0
关键字 | 作用 | 作用时机 | 说明 |
---|---|---|---|
FROM | 指定父镜像(在谁的基础上) | docker build时 | 必须在第一行 基于哪个images构建 |
MAINTAINER | 作者信息 | docker build时 | 作者 |
LABEL | 标签 | docker build时 | LABEL可以替代 MAINTAINER,最终都是在docker image基本信息中查看 |
RUN | 执行命令 | docker build时 | 执行一段命令,默认为/bin/sh 格式:RUN command或者RUN ["command","param1","param2"] ,多行RUN都会执行 |
CMD | 容器启动命令(默认用/bin/sh) | docker run时 | 启动容器时的默认命令和ENTRYPOINT配合使用,格式CMD command param1 param2 或者 CMD ["command","param1","param2"],docker run 命令带有命令的话也会覆盖CMD的内容, echo |
ENTRYPOINT | 入口 | docker run时 | 也有CMD的作用,可以执行命令,区别在于docker run 后面跟的指令,不能覆盖ENTRYPOINT的指令,意思ENTRYPOINT的内容一定会执行; 制作一些执行就关闭的容器中会用到 示例:ENTRYPOINT ["echo","hello"] |
COPY | 复制文件 | docker build时 | build时候复制文件到image中,可以将宿主机中的文件拷到镜像里面的目录去 |
ADD | 添加文件(从宿主机或网上添加文件到镜像中) | docker build时 | build时候添加文件到image中,如果是宿主机上压缩包,会自动解压到镜像中,如果是通过网络url下载的压缩包,则不会解压,不仅仅局限于当前build上下文,可以来源于远程服务 |
ENV | 环境变量 | docker build时 | 指定build时的环境变量,可以在dokcer run时,通过-e覆盖。Dokcerfile 格式ENV name=value, 容器run时格式:-e name=rr888,进入容器执行env,是全局生效的,系统级的 |
ARG | 构建参数 | docker build时 | 只在构建时使用的参数,如果有ENV那ENV的相同名字值,始终覆盖arg参数(优先级,ENV>ARG) |
VOLUME | 定义外部可挂载的数据卷 | docker build时 | 指定build的image那些目录可以启动时挂载到文件系统,启动容器时用-v绑定,格式 VOLUME["目录"] ,docker run -v 的优先级更高,会覆盖掉dockerfile里面的 |
EXPOSE | 暴露端口 | docker build时 | 容器运行的监听端口,启动容器使用-p绑定, 格式:EXPOSE 8080或者 EXPOSE 8080/udp,执行docker run -p命令时,优先级高于dockerfile的EXPOSE |
WORKDIR | 工作目录(可以有多个,会append追加路径) | docker build时 | 有cd命令的效果,1:RUN pwd就会输出WORKDIR指定的目录;2:进入容器就会在WORKDIR指定的目录;指定容器内部工作目录,如没有创建则自动创建,如果指定/使用的是绝对地址,如果不是/开头,那么是在上一条 WORKDIR的相对路径 |
USER | 指定执行用户 | docker build时 | 指定build或启动时,用户在RUN CMD ENTRYPOINT执行的用户 |
HEALTHCHECK | 健康检查 | docker build时 | 指定监测当前容器的健康检测命令,基本没用,因为应用本身有健康检测机制 |
ONBUILD | 触发器 | docker build时 | 当存在ONBUILD关键字的镜像作为基础镜像时,当执行FROM完成之后,会执行ONBUILD命令,但不影响当前镜像 |
STOPSIGNAL | 发送信号量到宿主机 | docker build时 | 本指令设置将发送到容器的系统调用信号以退出 |
SHELL | 指定执行脚本的shell | docker build时 | 指定RUN CMD ENTRYPOINT 执行命令的时候使用的shell |
9.3. 常见问题
- RUN 中如何执行多条命令
让命令在同一个shell中执行:
1:使用分号 (; 分隔命令:会在同一个 shell 中执行,示例:RUN pwd; ls; echo 666;
2:逻辑与 (&&) 分隔命令,前面命令执行成功(即返回状态为 0)才会继续执行下一个,示例: RUN pwd && ls && echo 666
3: 使用反斜杠 () 换行,可以在文件中换行,RUN pwd \
&& ls \
&& echo 666
4: 执行sh脚本
各命令相互独立,在不同shell执行:
多行都以RUN开头。
10. 网络 network
10.1. 创建
// 默认为bridge模式
docker network create 网络名
10.2. 列表
// 查看所有网络, 默认启动的容器的网络是桥接,bridge
docker network ls
10.3. 加入网络
-
创建容器时加入
docker run --network 网络名 镜像名 -
创建容器后加入
// 追加,容器可以有多个网络
docker network connect [选项]网络名 容器名或容器id
10.4. 查看
-
查看网络详情
// 可以查看该网络中有哪些容器
docker network inspect 网络id -
查看容器的网络
// 容器可以有多个网络
docker inspect 容器id
10.5. 删除
docker network rm 网络id
11. docker-compose
11.1. 安装
-
1:官网有介绍
-
2:去github官方仓库,下载tgz离线安装。
-
3:curl 一个国内镜像。
-
安装成功,可以查看版本
1: docker compose version // docker 自带的compose
2: docker-compose version // 当都安装compose的版本
11.2. 命令
-
构建镜像命令,build,示例: docker-compose build
-
启动命令,up(包含了build),示例: docker-compose up
-
查看运行的容器,ps,注意,需要在docker-compose.yml所在目录执行,示例:docker-compose ps
-
停止,stop, 示例:docker-compose stop
-
删掉所有容器,down,示例:docker-compose down
-
进入容器,exec,示例:docker-compose 容器名 bash
11.3. yaml文件存放目录
一般在/root/docker-compose/具体应用目录
11.4. yaml 示例
# docker-compose.yaml
version: '2'
services:
# db service for zentao
zentao-db:
image: mariadb:10.6
container_name: zentao-db
ports:
- '3306:3306'
volumes:
- /data/zentao/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=pass4Zentao
- MYSQL_DATABASE=zentao
networks:
- zentao-net
# zentao service
zentao:
image: hub.zentao.net/app/zentao
container_name: zentao
ports:
- '80:80'
volumes:
- /data/zentao/file:/data
depends_on:
- zentao-db
environment:
- ZT_MYSQL_HOST=zentao-db
- ZT_MYSQL_PORT=3306
- ZT_MYSQL_USER=root
- ZT_MYSQL_PASSWORD=pass4Zentao
- ZT_MYSQL_DB=zentao
- PHP_MAX_EXECUTION_TIME=120
- PHP_MEMORY_LIMIT=512M
- PHP_POST_MAX_SIZE=128M
- PHP_UPLOAD_MAX_FILESIZE=128M
- LDAP_ENABLED=false
- SMTP_ENABLED=false
- APP_DEFAULT_PORT=80
- APP_DOMAIN=zentao.demo.com
- PROTOCOL_TYPE=http
- IS_CONTAINER=true
- LINK_GIT=false
- LINK_CI=false
networks:
# 指定用networks下的zentao-net
- zentao-net
# 指定网络
networks:
# 网络名
zentao-net:
# 驱动类型,桥接模式
driver: bridge
11.5. yaml关键词解读
-
networks,用于自定义网桥名 位与最顶级
-
web.build: .
web是用于自己创建的app应用,并配合Dockerfile使用。
build: 基于当前目录的Dockerfile构建镜像。 -
ports:
前面是宿主机的,后面的是容器的。 -
volumes 有2种写法:
宿主机目录挂载到容器,容器里面操作,等于操作宿主机的目录。
1:一行,前面是宿主机,冒号后面为容器内部目录,示例:- /data/zentao/db:/var/lib/mysql -
links(推荐使用depends_on):
待废弃,因为:compose3,默认用自定义network driver,depends_on可以控制容器构建顺序,所以就把links替代了
作用1:jar包需要连redis,可以让redis先启动,在启动jar包。
作用2:springboot的yaml文件中redis的host地址,可以用docker-compose填的这个。
待亲测!
12. 项目部署
12.1. vue项目部署
- 思路
将打包的dist目录的所有内容,复制到nginx的html下
12.2. 所需镜像
- mysql redis nginx jdk
- springboot jar包
- vue工程
13. 推送到阿里云私有仓库
13.1. 准备阿里云资料
- 0 找到 容器镜像服务 / 实例列表 /镜像仓库
创建命名空间 - 1 阿里云私有仓库url
可在【访问凭证】命令行查看 - 2 账号
可在【访问凭证】命令行查看 - 3 密码
可在【访问凭证】页面设置
13.2. 命令行操作
- docker 登录
// 地址和账号可登录阿里云,在 容器镜像服务 / 实例列表 /访问凭证 查看
docker login --username=账号 阿里云docker私有仓库地址
- 本地镜像打标签
// jenkins:jdk17 jenkins=私有仓库的镜像名,jdk17=版本号
docker tag 本地镜像id registry.cn-hangzhou.aliyuncs.com/命名空间/jenkins:jdk17
- push 到私有镜像库
// 推送成功,默认为私有仓库
// jenkins:jdk17 是上面tag命令 对应的镜像名和版本号
docker push registry.cn-hangzhou.aliyuncs.com/命名空间/jenkins:jdk17
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?