Docker基础概念
仓库(Repository) 用来储存镜像(Image),镜像启动之后生成容器(Container)
常用的Docker仓库
Docker常用命令
docker pull mysql
将仓库中名为mysql的镜像拉取下来
docker ps
docker ps -a
所有停止和没有停止的镜像全部显示
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
docker run --name tomcat_test -d -p 8080:8080 tomcat
将镜像tomcat启动,并命名为tomcat_test,在后台运行,绑定端口[本地端口:容器端口]
docker exec -it acb040ac49da /bin/bash
docker exec -it nb-pay-test sh
在运行的容器中执行命令,上面命令为进入容器ID为acb040ac49da的容器内部,执行命令
docker logs -f tomcat_test --tail=10
从容器中获取日志,–tail 截取最近的N条,-f 跟踪日志输出
docker images
docker rm $(docker ps -a -q)
清除所有没有在运行的容器
docker rmi -f tomcat
删除本地镜像,-f强制
docker restart tomcat_test
docker stop acb040ac49da
docker cp demo-0.0.1-SNAPSHOT.war acb040ac49da:/usr/local/tomcat/webapps
将文件拷贝到某某处,例子为将war包拷贝入tomcat的webapps中
在容器退出时总是重启容器
docker run -d --restart always 容器名
- 如果是正在执行的容器需要改变它的启动策略,则使用
docker container update --restart=always 容器名字
将Springboot项目部署到Docker的Tomcat
其实和本地项目部署到独立的tomcat中操作是一致的,只是许多命令变成了docker开头,如拷贝变成了docker cp
查看redis对应ip
docker inspect redis
获取指定容器的信息
然后在Spring项目中更改redis端口即可
docker设置固定IP
附加redis修改
keys *back
找出所有key中以back结尾的keyget systemConfig_base_path_back
显示key为XX的值set systemConfig_base_path_back http://localhost:8090
设置值
配置mysql
docker run --name mysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
启动mysqldocker exec -it mysql /bin/bash
进入mysql容器内mysql -uroot -proot --default-character-set=utf8
打开客户端create database sport_test character set utf8;
创建database,记得需要在结尾处添加分号docker cp sport_test.sql 5988bdb4afa2:/usr/share/mysql
将sql文件上传到mysql容器中use sport_test;
source /usr/share/mysql/sport_test.sql;
导入sql文件
docker挂载
nginx启动时,将宿主机目录挂载在容器内目录中
冒号”:”前面的目录是宿主机目录,后面的目录是容器内目录
docker run --name nginx -p 7070:80 -d -it -v /Users/mintaoyu/Desktop/nginx:/etc/nginx/conf.d nginx /bin/bash
当宿主机没有该目录时,自动创建目录和容器内目录关联
创建自定义网络,绑定固定IP
注意:docker 容器在启动时默认使用的是bridge 模式,每次启动docker容器的IP都不是固定的,项目启动的先后顺序影响IPAddress,之前绑定的端口如果启动顺序错了,项目启动就会报错,因为IP变了
解决方案是自定义网络
docker network create --subnet=192.168.17.0/16 mynetwork
然后就可以在启动容器时,添加--network
和--ip
比如
docker run --name tomcat --network mynetwork --ip 192.168.17.1 -d -p 8090:8080 tomcat
docker run --name redis --network mynetwork --ip 192.168.17.2 -d -p 6380:6379 redis
docker run --name mysql --network mynetwork --ip 192.168.17.3 -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.6
docker run --name nginx --network mynetwork --ip 192.168.17.4 -p 7070:80 -d -it -v /Users/mintaoyu/Desktop/nginx:/etc/nginx/conf.d -v /Users/mintaoyu/Desktop/html:/usr/share/nginx/html nginx /bin/bash
IDEA上传SpringBoot项目到Docker
- 创建Dockerfile
需要注意的是Dockerfile中COPY位置是相对的,所以建议将Dockerfile放在pom那一层
1 | FROM java:8 |
Docker部署用脚本
1 |
|
注意的是要和DockerFile放在同一目录下,然后运行脚本
制作Springboot项目Docker镜像
步骤如下:
- 同上一步,在服务器新建Dockerfile文件并写入相同内容
docker build -t 自定义镜像名 .
docker run --name 自定义名字 -p 7777:7777 -d 自定义镜像名
<!--2020年9月24日更新-->
Dockerfile自定义
1 | # 基于基准镜像,接下来的操作都是对基准镜像的一个操作 |
ENV JAVA_HOME /usr/local/openjdk8
指定环境变量EXPOSE
将容器内部端口暴露给物理机
1 | # 在创建镜像时执行的命令,修改镜像内部文件 |
从0开始构建redis镜像
单向通信 –link
使用link的原因:容器的ip地址会变,集群的时候变更不方便,所以可以采用link进行连接
比如A容器需要访问B容器才能运行,B容器不需要访问A容器,那么在A容器镜像启动的时候,需要添加link命令进行双方通信
原先ping对方的IP可以替换为ping对方容器名称
例如:docker run --name myweb --link mydb
那么在myweb容器内部去访问mydb容器,原先是ping 172.0.0.1
现在变为ping mydb
即可
双向通信 –Bridge
1 | # 显示docker中所有可用的网络服务 |
Volume数据共享(挂载)
集群服务,数据共享同步
新思路
1 | # 定义一个什么事情都不干,单纯是挂载关联的卷 |
Docker Compose(单机多容器部署工具)
1 | # Docker-Compose版本号 |
不要该容器时,使用命令docker-compose down --volumes
容器访问宿主
具体案例,容器canal访问mac本地mysql服务
docker 新版本中在容器中可以通过 host.docker.internal
来访问主机,因此canel的配置可以如下canal.instance.master.address=host.docker.internal:3306