Docker的基本使用

Docker基础概念

仓库(Repository) 用来储存镜像(Image),镜像启动之后生成容器(Container)

常用的Docker仓库

Docker常用命令

  • docker pull mysql

将仓库中名为mysql的镜像拉取下来

  • docker ps
  • docker ps -a 所有停止和没有停止的镜像全部显示
1
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
acb040ac49da tomcat "catalina.sh run" 2 days ago Up 33 minutes 0.0.0.0:8080->8080/tcp tomcat_test
  • 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结尾的key
  • get 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 启动mysql
  • docker 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
2
3
4
5
6
7
8
FROM java:8
VOLUME /tmp
ADD Refund.jar app.jar
ENV TZ=Asia/Shanghai
RUN sh -c 'touch /app.jar' && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV JAVA_OPTS=""
ENV SERVER_PORT=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar --server.port=$SERVER_PORT" ]

Docker部署用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env bash

if [ $UID -ne 0 ]; then
echo "Superuser privileges are required to run this script."
echo "e.g. \"sudo $0\""
exit 1
fi

# nb-pay-test为项目名
docker stop nb-pay-test

docker rm nb-pay-test

docker rmi nb-pay-test

docker build -t nb-pay-test:latest

## 将Linux系统中/home/ymt/refund下的文件夹挂在到Docker容器中的/home目录下,资源可从home目录下取出
docker run -d --name=nb-pay-test -p 8888:8888 -v /home/ymt/refund/:/home/ -e SERVER_PORT=8888 nb-pay-test --restart=always

注意的是要和DockerFile放在同一目录下,然后运行脚本

制作Springboot项目Docker镜像

步骤如下:

  • 同上一步,在服务器新建Dockerfile文件并写入相同内容
  • docker build -t 自定义镜像名 .
  • docker run --name 自定义名字 -p 7777:7777 -d 自定义镜像名

<!--2020年9月24日更新-->

Dockerfile自定义

1
2
3
4
5
6
# 基于基准镜像,接下来的操作都是对基准镜像的一个操作
FROM tomcat:latest
# workdir命令类似于cd命令,进入Docker容器内部的目录
WORKDIR /usr/local/tomcat/webapps
# ADD 添加命令 ADD有自动解压缩功能 将物理机复制到镜像中去
ADD docker-web ./docker-web
  • ENV JAVA_HOME /usr/local/openjdk8 指定环境变量
  • EXPOSE 将容器内部端口暴露给物理机
1
2
3
4
5
6
7
# 在创建镜像时执行的命令,修改镜像内部文件
RUN ${JAVA_HOME}/bin/java -jar test.jar
# 在创建容器时执行的命令,修改容器内部文件
# 推荐使用Exec格式["","",""]
# 只有Dockerfile中最后一个ENTRYPOINT/CMD会被执行
# ENTRYPOINT后面跟着固定不变的命令,而CMD可以随着docker启动再自定义
CMD/ENTRYPOINT

从0开始构建redis镜像

使用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
2
3
4
5
6
7
8
9
10
# 显示docker中所有可用的网络服务
docker network ls
# 自定义创建网桥
docker network create -d bridge my-bridge
# 建立2个容器
docker run --name c1
docker run --name c1
# 关联网桥
docker network connect my-bridge c1
docker network connect my-bridge c2

Volume数据共享(挂载)

集群服务,数据共享同步

新思路

1
2
3
4
5
# 定义一个什么事情都不干,单纯是挂载关联的卷
docker create --name 卷名称 -v 挂载目录:目标目录 镜像名称 /bin/true
# 启动挂载
docker run -p 8080:8080 --volumes-from 卷名称 --name tomcat1
docker run -p 8081:8080 --volumes-from 卷名称 --name tomcat2

Docker Compose(单机多容器部署工具)

官方案例-wordpress部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Docker-Compose版本号
version: '3.3'

services:
db:
# 类似于docker run mysql:5.7
image: mysql:5.7
volumes:
# 类似于-v localpath:/var/lib/mysql,其中db_data是自定义参数,值在下面
- db_data:/var/lib/mysql
# 自动重启
restart: always
# 类似于docker run -e MYSQL_ROOT_PASSWORD = somewordpress
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
# 只有在前面db容器部署完的时候才会部署这个wordpress容器
# 类似于docker --link db
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
# 因为前面做了--link处理,所以这里可以用镜像名称代替ip
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}

不要该容器时,使用命令docker-compose down --volumes

容器访问宿主

具体案例,容器canal访问mac本地mysql服务

docker 新版本中在容器中可以通过 host.docker.internal来访问主机,因此canel的配置可以如下canal.instance.master.address=host.docker.internal:3306

赏个🍗吧
0%