重要概念
- 仓库
- 远程仓库:docker公司在世界范围内维护一个中心 用来集中管理docker中镜像 --> 搜索仓库 docker hub
- 本地仓库:用来存储自己使用过的镜像, 在中心仓库下载镜像到本地仓库 /var/lib/docker
- 镜像 image
- 定义:一个镜像就是一个软件 mysql镜像 tomcat镜像 jdk镜像 redis 镜像。。
- 特点: 镜像是只读 不能进行写操作
- 容器 container
- 定义: 镜像没运行一次会生成一个容器 一个容器代表一个正在运行的软件服务
- 特点:容器可读写
操作
-
镜像操作
#1 查看镜像 -- 本地 docker images #2 搜索镜像-- 首先本地 -- 默认地址 docker search tomcat #3 找到所有的镜像 --拉取 pull 拉取到本地宿主机 docker pull tomcat # 最新版本 docker pull tomcat:7 # 指定版本 # 删除镜像 docker rmi 镜像id
-
容器操作
- 命令格式 docker 命令【选项】
# 根据tomcat 镜像 创建一个myTomcat容器 docker create --name=myTomcat tomcat # 只是创建,没有运行 # 查看容器 docker ps # 查看在运行的容器 docker ps -a # 查看所有的容器 # 容器筛选 docker ps | grep tomcat # 运行 启动容器 docker start myTomcat # start后面可以跟容器的id 或者 name # 停止容器 docker stop myTomcat # stop后面可以跟容器的id 或者 name # 重启容器 docker restart myTomcat # 暂停/恢复 docker pause/unpause myTomcat # 删除没有运行的容器 docker rm 容器id 或者名字 # 删除在运行的容器 docker rm -f 容器id 或名字 # 删除所有容器 # 先停止所有容器 docker stop $(docker ps -a -q) # 结束容器 docker kill 名称或id # 删除 docker rm $(docker ps -qa) # windows 下使用有问题 #删除所有镜像 docker rmi $(docker images -q)
- 运行
#1- 查看docker run 命令-- 创建并且启动容器 docker run -- help 1-判断本地是否有这个镜像 -- 如果没有会自动pull 2-创建容器 3-运行容器 docker run 参数 -i # 运行容器 -t #容器启动后 进入命令行 -v #目录映射(共享目录) --挂载 -v 宿主机目录:容器的目录 -d #守护进程 -- 后台运行 -p #端口映射 -p 宿主机的端口:容器的端口-应用默认的端口 例:如果容器里面有tomcat, 本机windows想访问: docker tomcat 端口号8080 需要在虚拟机映射一个端口9099 # -p 宿主机端口: 容器端口(固定) -v 宿主机位置:容器位置 docker run -id --name t2 -p 8090:8080 -v /usr/lovy:/usr/local/tomcat/webapps tomcat #2- 创建容器,并且进入命令行 --进入容器 docker run -di --name=mytomcat2 tomcat docker run -it --name=mytomcat tomcat /bin/bash #3 进入容器 /bin/bash/ 进入命令行模式 docker exec -it tomcat1 /bin/bash -i 以交互模式运行容器,通常与-t一起使用 -t 分配一个伪终端 shell窗口 bash #4 查看日志 docker logs 容器id或名称 -t 加入时间戳 -f 跟随最新的日志打印 -tail 数字 显示最后多少条 #5 容器与宿主机之间的复制文件 docker cp 文件|目录 容器id:容器路径 --- 将宿主机复制到容器 docker cp 容器id:容器内资源路径 宿主机目录路径 --- 讲容器内资源拷贝到主机上 #6 部署web项目 war包项目 a.将 test.war上传到服务器 b.通过docker cp命令将test.war复制到 tomcat的webapps目录中即可 c.使用ip端口进行测试
问题
-
tomcat:8.0
默认用户 密码 需要自己添加-
修改容器内部
/usr/local/tomcat/conf/tomcat-users.xml
文件-
使用
docker cp
把文件先拷贝到本机 修改完之后在拷贝到容器 -
修改内容
<role rolename="manager-gui"/> <user username="admin" password="admin" roles="manager-gui"/>
-
#1 查看容器内运行进程 docker top 容器id或名称 #2 查看容器内部细节 docker inspect 容器id #3 容器数据卷(volume)机制 a.数据卷 Data volume 作用: 用来实现容器中数据和宿主机中数据进行映射的(同步) 注意: 数据卷必须在容器首次启动时设置 使用: docker run -v 宿主机目录:容器目录 1.使用绝对路径设置数据卷 docker run -v 宿主机绝对路径:容器绝对路径:ro ro: read only 如果设置数据卷时指定ro,代表日后容器内路径是只读的 注意:这种方式将容器路径的原始内容全部清空,始终以宿主机路径为主 2.使用别名方式 设置数据卷 docker run -v aa:/usr/local/tomcat/webapps aa: 代表docker数据卷的别名 注意:如果别名存在,直接使用;否则自动创建 使用别名方式保留容器路径原始内容,前提别名对应路径不能存在内容 根据别名创建的目录 默认在 /var/lib/docker/volumes/aa 【仅限linux】 【数据 最好方法数据卷】比如 mysql数据
#1 把容器打包成一个新的镜像 a.容器可读可写 基于这个特性就可以对容器进行自己深度定制 docker commit -m "描述信息" -a "作者信息" (容器id或名称) 打包的镜像名称:标签 #2 镜像备份 还原 docker save 镜像名:tag -o 名称.tar # 名称最好带上版本号 docker load -i 镜像名.tar
-
Docker镜像原理
- Imagej镜像
- 容器独立操作系统(精简linux操作系统+软件服务)===》镜像运行 ==》镜像(操作系统 + 软件文件)
- 镜像 是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
UnionFS
: 联合文件系统 叠加文件系统 ;Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。- bootfs ( boot file system )主要包含bootloader和kernel , bootloader主要是引导加载kernel , Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix系统是一样的,包含boot加载器( bootloader )和内核( kernel )。当boot加载完后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
- rootfs ( root file system ),在boots之上,包含的就是典型的linux系统中的/dev , /proc, /bin , letc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/Centos等等。
- 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才20OMB?对于一个精简的os , rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs.
MySql 服务
-
访问 docker hub
- 搜索 mysql
- 确定 版本
-
下载
docker pull mysql:5.6
-
运行
-
启动 mysql 开放端口映射 3306
- -e MYSQL_ROOT_PASSWORD=XX设置密码
- -d 后台运行 --name指定名称 --restart=always跟随容器重启自启
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysql01 --restart=always mysql:5.6
-
数据卷持久化数据到宿主机(同步文件夹)
-
docker run -p3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysql02 --restart=always -v /root/data:/var/lib/mysql mysql:5.6
-
【问题】这里数据卷 同步时,如果宿主机文件夹不全为空; 数据库存在混乱,源数据表会消失
-
-
-
数据备份
-
数据卷备份
- 数据卷备份是将底层文件进行备份,不利于数据迁移 和 备份;推荐使用sql文件形式备份数据
-
数据库备份成 sql文件
mysqldump
-
备份全部数据
docker exec mysql容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
-
导出指定库
docker exec mysql容器id sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
-
导出指定数据库 不要数据
docker exec mysql容器id sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
-
-
执行sql文件 到mysql中
docker exec -i mysql容器id sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/xxx.sql
-
安装redis 服务
-
搜索镜像
docker search redis
-
拉取redis到本地
docker pull redis
-
启动 redis 服务运行容器
# 没有暴露外部端口 docker run --name redis -d redis:tag # 暴露外部宿主机端口为6379进行连接 数据内存--->持久化(快照文件aof文件【】) docker run --name redis01 -p 6379:6379 -d redis:tag docker run --name redis02 -p 6380:6379 redis:5.0.10 redis-server --appendpnly yes # 最终启动方式 docker run --name redis03 -p 6381:6379 -v /root/redisdata:/data redis:5.0.10 redis-server --appendonly yes
-
redis持久化 aof rdb
rdb
快照redis服务器将某一个时刻数据以快照文件形式写入到磁盘(默认)aof
redis服务器将所有redis客户端的写操作以命令方式记录到日志文件中
【注意】只要开启持久化,将持久化文件生成容器中 /data/ 目录中
-
-
查看日志
docker logs -t -f 容器id|容器名称
-
进入容器内部查看
docker exec -it 容器id|名称 bash
-
加载外部自定义配置 启动redis容器
# 默认redis官方镜像中没有redis.conf 配置文件 需要去官网下载指定版本的配置文件 1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz 下载官方安装包 2. 将官方安装包中配置文件进行复制到宿主机指定目录中如 /root/redis/redis.conf文件 3. 修改需要自定义的配置 bind 0.0.0.0 开启远程权限 appendonly yes 开启aof持久化 4. 加载配置启动 docker run --name redis01 -v /root/redis.conf:/usr/redis.conf -p 6379:6379 -d redis redis-server /user/redis.conf # 容器内进入redis redis-cli
# 自定义配置文件启动 redis 1. a. 获取redis 官网下载,找到对应配置文件 进行修改 【使用完整的配置文件启动】 b. 上传配置文件到宿主机指定目录 /root/rediscon/redis.conf c. 数据卷 挂载配置启动 【注意宿主机文件路径】 docker run --name redis03 -d -p 6379:6379 --restart=always -v /root/redisconf:/data redis:5.0.14 redis-server /data/redis.conf 2. 创建指定文件名称 直接书写修改属性即可
Nginx服务器
-
搜索 docker hub nginx
-
下载对应镜像
docker pull nginx:1.19:10
-
运行nginx
# a.启动nginx 映射端口(80) docker run -p 80:80 nginx:1.19.10 # b.启动 映射端口 后台启动 总是启动 指定名称 docker run -p 80:80 -d --restart=always --name nginx01 nginx:1.19.10 # c.启动 映射端口 后台启动 总是启动 指定名称 加载指定nginx配置 # 1.反向代理 负载均衡 把容器中的 nginx.conf 拷贝出来 docker run -p 80:80 -d --restart=always --name nginx01 -v /root/nginxconfig/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10 # 2.nginx服务器 挂载目录 docker run -p 80:80 -d --restart=always --name ngxin02 -v 宿主机目录:/usr/share/nginx/html/ nginx:1.19.10
安装ElasticSearch服务
-
搜索docker hub
-
下载对应镜像
docker pull elasticsearch:6.8.10
-
运行 es
# 启动es 映射端口(9200 http) (9300 tcp) docker run -p 9200:9200 -p 9300:9300 elasticsearch:6.8.10 # 启动es 映射端口 后台启动 总是启动 指定名称 docker run -p 9200:9200 -p 9300:9300 -d --restart=always -name=es elasticsearch:6.8.10 # 启动es 通过数据卷映射数据 容器存放目录(/usr/share/elasticsearch/data) docker run -p 9200:9200 -p 9300:9300 -d --restart=always -name=es -v 宿主机目录:/usr/share/elasticsearch/data elasticsearch:6.8.10 # 启动es 通过数据卷映射配置 容器存放目录(/usr/share/elasticsearch/config/elasticsearch.yml) docker run -p 9200:9200 -p 9300:9300 -d --restart=always -name=es -v 宿主机目录:/usr/share/elasticsearch/data -v 宿主机目录:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:6.8.10
【注意】ES启动如果没有指明单击方式运行,默认使用集群方式启动,如果使用集群方式启动在启动时会出现如下错误
-
max virtual memory areas vm.max_map_count[65530]
# 1.在centos虚拟机 修改配置 sysctl.conf vim /etc/sysctl.conf # 2.加入如下配置 vm.max_map_count=262144 # 3.启用配置 sysctl -p
-
容器之间的通信 网络使用
-
容器间通信
- 当Docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是Linux的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给docker0接口。比如典型的172.17.42.1,掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16 )的地址。
当创建一个Docker容器的时候,同时会创建了一对veth pair 接口((当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0 ;另一端在本地并被挂载到dockere网桥,名称以veth开头(例如vethAQI2QT )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
- 当Docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是Linux的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
-
网络总结
- 默认 docker在创建容器时将 所有容器都连接在docker0网桥上,默认在docker0网桥的容器都可以使用容器内的ip 进行通信
- 默认 docker在创建容器时将 所有容器都连接在docker0网桥上,默认在docker0网桥的容器都可以使用容器内的名称作为容器的ip 进行通信【注意】使用容器名称必须自定义网桥,不能使用默认docker0
-
自定义网桥
-
docker网桥类型 (查看 docker network ls)
NETWORK ID NAME DRIVER(类型) SCOPE 1ee16437a7da bridge bridge local 1c328d413f51 host host local bc41b2f56d67 none null local
-
创建自定义网络桥 docker network --help
docker network create -d bridge 网络名称 # (默认)
-
查看某一网络细节
docker network inspect 网络名
-
删除一个网络
docker network rm 网络名 docker netword prune 网络名
-
运行多个容器在指定网络中
# a.启动时 明确指定容器使用哪个网络 docker run -d --network 网络名称 # b.启动之后让容器加入某个网络 docker network connect 网络名 容器id或名称
-
高级卷
-
数据卷 volume
- 定义: 用来实现宿主机和容器之间文件目录映射同步
-
别名代表一个docker自身维护数据卷
# 1.查看所有docker维护数据卷 docker volume ls # 2.查看数据卷详细信息 docker volume inspect 卷的别名 # 3.删除数据卷 docker volume rm 卷的别名 # 4.创建别名 docker volume create 卷的别名
DockerFile
-
Dockerfile
可以认为是 Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。- 作用:通过 Dockerfile文件构建一个属于自己镜像
-
操作
- 在指定位置创建一个 Dockerfile文件;编写dockerfile相关语法
- 通过Dockerfile 构建镜像
docker build -t aa:1.0 .
(指定Dockerfile文件位置)
-
构建镜像流程
-
【注意】 一行只有一条完整指令
-
基础内容
1.每条保留字指令都必须为大写,且后面都要跟至少一个参数 2.指令按照从上到下,顺序执行 3. #表示注释 4.每条指令都会创建一个新的镜像层,并对镜像进行提交
-
保留命令
#
注释 但一定要隔行保留字 左右 FROM 当前镜像是基于哪个镜像 第一个指令必须是FROM
RUN 构建镜像时需要运行的指令 EXPOSE 当前容器对外暴露的端口号 WORKDIR 指定在创建容器后,终端默认进入的工作目录,一个落脚点 ENV 用来在构建镜像过程中设置环境变量 ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包 COPY 类似于ADD 拷贝文件和目录到镜像中
将构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置VOLUME 容器数据卷,用于数据保存和持久化工作 CMD 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定 容器启动程序及其参数
FROM命令
-
基于哪个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指定出现
-
语法
FROM <image> FROM <image>[:<tag>] # 使用版本不写为latest FROM <image>[@<digest>] # 使用摘要
RUN 命令
-
RUN指令将在当前映像之上的新层中执行任何命令并提交结果,生成的提交映像将用于Dockerfile中的下一步
-
语法
RUN <command> (shell form, the command is run in a shell,which bydefault is /bin/sh -c on Linux or cmd /s /c on Windows) RUN echo hello # 添加缓存 RUN ["yum", "install", "-y", "vim"] RUN [ "executable" , "param1", "param2" ] (exec form) RUN [ " /bin/bash" , "-c", "echo hello " ]
EXPOSE命令
-
用来指定构建的镜像在运行为容器时对外暴露的端口
-
语法
EXPOSE 80/tcp如果没有显示指定则默认暴露都是tcp EXPOSE 88/ udp
CMD命令
-
用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
【注意】Dockerfile中只能有一条CMD指令,如果列出多个命令,则只有最后一个命令才会生效
-
语法
CMD ['executable', 'param1', 'param2'] (exec form, this is the preferred form) CMD ['param1', 'param2'] (as default parameters to ENTRYPOINT) CMD command param1 param2 (shell form)
WORKDIR命令 通过docker exec -it id bash 进入的入口点
-
用来为Dockerfile中任何RUN CMD ENTERPOINT COPY ADD指令设置工作目录。如果WORKDIR不存在,及时它没有在任何后续Dockerfile指令中使用,它也将被创建
-
语法
WORKDIR /path/to/workdir WORKDIR /a WORKDIR b `注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前wORKDIR指令的路径相对`
ENV命令
-
用来为构建镜像设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中。
-
语法
ENV <key> <value> ENV <key> <value>
ADD命令
-
用来从context上下文复制新文件、目录或远程文件url, 并将它们添加到位于指定路径的映像文件系统中。
-
语法
ADD hom* /mydir/ # 通配符添加多个文件 ADD hom?.txt /mydir/ # 通配符添加 ADD https://downloads.apache.org/tomcat/tomcat-9/v9.0.48/bin/apache-tomcat-9.0.48.tar.gz . # 添加网络 依赖
ENTRYPOINT CMD
-
都是用来指定容器启动时默认执行指令
- CMD 可以存在多个,但只有最后一个生效
-
语法
# 直接命令方式 java -jar ems.jar # json 数组 推荐 ["java", "-jar", "ems.jar"]
# 1.cmd里面命令如果在运行在容器时 进行覆盖 docker run 镜像:版本号 覆盖自定义命令 ls / # 2.entrypoint 命令如果在运行容器时 进行覆盖 docker run --entrypoint=覆盖指令 镜像:版本号 传递参数
-
使用
ENTRYPOINT
用来书写一个固定的指定CMD
用来给ENTRYPOINT
传递参数
【注意】配合使用时必须使用json数组语法
FROM centos:7 # yum install -y vim RUN ["yum", "install", "-y", "vim"] # 声明容器中服务使用端口 EXPOSE 15672 EXPOSE 5672 EXPOSE 8081 ENV BASE_PATH=/app/data WORKDIR $BASE_PATH ADD aa.txt $BASE_PATH ADD https://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.69/bin/apache-tomcat-9.0.69.tar.gz . RUN tar -zxvf apache-tomcat-9.0.48.tar.gz RUN rm -rf apache-tomcat-9.0.48.tar.gz RUN mv apache-tomcat-9.0.48 tomcat-9.0.48 # 这仅仅是个声明,告诉使用者容器中可以挂载这个目录到宿主机中 VOLUME $BASE_PATH # 只要使用 docker run 容器名称或id 就会自动执行 # CMD ls $BASE_PATH ENTRYPOINT ["ls"] CMD ["/apps/data"]
-
【关于flask无法远程访问问题】
- 设置通配符IP地址0.0.0.0
docker-compose
-
docker进行项目部署
-
为了完成一个完整项目 使得n多个容器配合完成项目中业务开发;解决容器之间的依赖问题
-
简介
- compose允许用户通过一个单独的
docker-compose.yml
模板文件(YAML格式)来定义一组相关联的应用容器为—个项目( project ) . - Compose中有两个重要的概念︰
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,在
docker-compose.yml
文件中定义。 - 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,在
- compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
- compose项目由Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker APl,就可以在其上利用compose来进行编排管理。
- compose允许用户通过一个单独的
-
离线安装
- 下载
- 移动
mv docker-compose /usr/local/bin
- 执行
sudo chmod +x /usr/local/bin/docker-compose
-
docker-compose 使用
-
version
: docker-compose版本 和 docker版本的对应关系 -
书写docker-compose
# 代表使用docker-compose项目的版本号 version: "3.8" services: tomcat: #container_name: tomcat01 # 给当前容器指定名称 image: tomcat:8.0 # 代表使用哪个镜像 ports: # 代表宿主机和容器中端口映射 - 8080:8080 redis: image: redis:latest ports: - "6379:6379" mysqldb: image: mysql:latest ports: - "3306:3306" environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass volumes: # - /root/mysqldata1:/var/lib/mysql - db:/var/lib/mysql # 使用别名需提前声明 volumes: db: # 声明别名数据卷
-
启动docker-compose
docker-compose up # 必须在docker-compose.yaml配置文件目录下执行 # 若不使用默认的docker-compose.yml 文件名: docker-compose -f server.yml up -d docker-compose down # 移除
-
-
模板 https://yeasy.gitbook.io/docker_practice/compose/compose_file
build
通过docker-compose在启动容器之前,先根据dockerfile构建镜像,然后根据构建镜像启动容器。
version: "3.8" services: tomcat: image: tomcat:latest restart: always ports: - "8000:8000" apps: restart: always # build: ./ # 指定Dockerfile上下文目录(dockerfile文件所在的位置) build: context: ./dir dockerfile: Dockerfile # 指定Dockerfile文件名称 ports: - "8081:8081" # command: ["test.jar"] depends_on: - tomcat # 依赖服务 networks: - ems mysql: restart: always image: mysql:5.6 ports: - "3306:3306" env_file: - .env volumes: - mysqlData:/var/lib/mysql networks: - ems # 声明网桥 networks: ems: # 声明别名 volumes: mysqlData:
-
command
覆盖容器启动后默认执行的命令 -
container_name
指定容器名称 -
depends_on
解决容器依赖、启动先后问题- web服务不会等待 被依赖的服务完全启动
version: "3" services: web: build: . depends_on: - db - redis redis: image: redis db: image: mysql
-
environment
不是特别隐私的内容version: "3" services: mysql01: image: mysql:5.6 ports: - "3306:3306" environment: MYSQL_DATABASE: exampledb # - "MYSQL_DATABASE=exampledb"
-
env_file
比较隐私的内容# 单个文件 env_file: .env # 多个文件 env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
-
# common.env MYSQL_USER=exampleuser MYSQL_PASSWORD=examplepass
-
-
expose
用来指定构建镜像过程中 暴露的端口号 -
image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose
将会尝试拉取这个镜像 -
networks
用来指定启动容器使用的网桥version: "3" services: some-service: networks: - some-network - other-network # 声明网桥 networks: some-network: other-networks:
-
ports
指定 宿主机端口:容器端口 (HOST:CONTAINER)ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
-
volumes
指定 宿主机中容器目录 目录映射 -
restart
指定docker服务 总是运行
-
docker-compose命令
# docker-compose 命令 项目|项目中某个服务 # 语法 docker-compose -f docker-compose.yml 命令 [选项] [服务id] -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。 -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。 –x-networking 使用 Docker 的可拔插网络后端特性 –x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge –verbose 输出更多调试信息。 -v, --version 打印版本并退出。 # 1.up [服务id] 尝试自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作 # docker-compose up -d # 后台启动并运行容器 docker-compose up # 对整个项目操作 docker-compose up 服务id # 对当前docker-compose中对应服务id容器操作 #服务id services下面的名称 比如tomcat mysql01 # 2.down 关闭所有容器 并移除网络 docker-compose down # 对整个项目操作 docker-compose down [服务id] # # 3.exec 进入容器 docker-compose exec [服务id] bash # 4.ps 列出项目中的所有容器 docker-compose ps -q # 打印 id # 5.restart docker-compose restart # 对整个项目 docker-compose restart -t 10 [服务]id # 指定 时间之后 重启某项服务 # 6.rm 删除 docker-compose rm [服务id] -f 强制删除 -v 删除数据卷 # 7.start # 8.stop # 9.top 查看整个项目中所有服务容器内运行进程或 指定di服务的容器进程 docker-compose top [服务id] # 10.pause # 11.unpause # 12.logs docker-compose logs [服务id] # services下面的名称
docker可视化工具
-
安装portainer
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer