目录
环境:
阿里云服务器,centos8(docker更喜欢8)
这里是docker-compose直接启动的docker容器,非docker swarm集群。
以三个容器为例,nginx,msyql,java服务
前提安装docker及docker-compose
顺带顺一下docker的安装配置
安装docker
可以参考菜鸟教程:
https://www.runoob.com/docker/centos-docker-install.html
开机启动:
#开机启动
systemctl enable docker
#启动docker
systemctl start docker.service
#重启docker
systemctl restart docker.service
#停止docker
systemctl stop docker.service
配置docker镜像加速
添加自定义配置文件:
cd /etc/docker
vim daemon.json
vim daemon.json
添加一下内容: (这里只加了网易和百度云的镜像,如果你有阿里云的可以参考菜鸟教程中的吧阿里的仓库地址也加上)
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
重启docker:
systemctl restart docker.service
查看信息 执行
docker info
Registry Mirrors:
https://hub-mirror.c.163.com/
https://mirror.baidubce.com/
安装docker-compose
查看最新版本:https://github.com/docker/compose/releases
目前是:1.27.4
执行命令安装
`curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose`
以下进入正题:
创建网络
创建名为net-ehooyun的bridge网络,适用于单机内部。overlay网路是集群用的。
docker network create -d bridge net-ehooyun
详情或测试方法可以参照:
https://www.runoob.com/docker/docker-container-connection.html
配置DNS:
参照菜鸟:
https://www.runoob.com/docker/docker-container-connection.html
编辑上边提到的daemon.json ,加入dns配置即可
vim /etc/docker/daemon.json
编辑后内容如下:
{
"registry-mirrors": [
"https://imhqgpul.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启 docker 才能生效。
查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:
docker run -it --rm ubuntu cat etc/resolv.conf
配置应用
开始配置应用的docker-compose文件
方式一、
三个服务在一个docker- compose文件中如下:
docker-compose.yml
version: '3.3'
services:
nginx:
image: nginx
# hostname: nginx
#image: nginx:1.19.1-alpine
container_name: nginx
restart: always
privileged: true
environment:
- TZ=Asia/Shanghai
ports:
# - 8080:80
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
#- /ehooyun/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
- /ehooyun/nginx/conf.d:/etc/nginx/conf.d
- /ehooyun/logs/nginx:/var/log/nginx
- /ehooyun/nginx/dist:/opt/dist:ro
networks:
- net-ehooyun
# 指定服务名称
diamond:
# 指定服务使用的镜像
image: diamond
# hostname: diamond
# 指定容器名称
container_name: diamond
# 指定服务运行的端口
ports:
- target: 8080
published: 8080
mode: host
# 指定容器中需要挂载的文件
volumes:
- /etc/localtime:/etc/localtime
- /ehooyun/logs/diamond:/var/logs
networks:
- net-ehooyun
mysql:
# network_mode: "host"
# hostname: mysql
restart: always
container_name: mysql
image: mysql:5.7
command:
--lower_case_table_names=1
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--explicit_defaults_for_timestamp=true
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: qwe123123fasdfa
#MYSQL_USER: 'ehoonyun'
#MYSQL_PASS: 'ehooyun12123'
ports:
- 3306:3306
volumes:
- /ehooyun/mysql/data:/var/lib/mysql
- /ehooyun/mysql/config:/etc/mysql/conf.d
- /ehooyun/mysql/log:/var/log/mysql
networks:
- net-ehooyun
networks:
net-ehooyun:
external: true
启动命令:
docker-compose -f /ehooyun/compose/docker-compose.yml up -d
启动所有服务后可以看java服务是否能连上myql
或者通过配置网络那还不的测试方法测试一下。进入容器使用ping mysql 或者curl mysql的方式来测试一下是否互通。
主要关注点:
- 每个service的
networks:
- net-ehooyun
- 最终的
networks:
net-ehooyun:
external: true
就ok了,
方式二、
由于单个服务经常单独重启,所以我也为内个服务单独创建了compose文件,单独使用的话可以如下拆分:
mysql:
docker-compose-mysql.yml
version: '3.3'
services:
mysql:
# network_mode: "host"
# hostname: mysql
restart: always
container_name: mysql
image: mysql:5.7
command:
--lower_case_table_names=1
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
--explicit_defaults_for_timestamp=true
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: qwe12312331afadf
#MYSQL_USER: 'ehoonyun'
#MYSQL_PASS: 'ehooyun12123'
ports:
- 3306:3306
volumes:
- /ehooyun/mysql/data:/var/lib/mysql
- /ehooyun/mysql/config:/etc/mysql/conf.d
- /ehooyun/mysql/log:/var/log/mysql
networks:
- net-ehooyun
networks:
net-ehooyun:
external: true
java:
docker-compose-diamond.yml
version: '3.3'
services:
# 指定服务名称
diamond:
# 指定服务使用的镜像
image: diamond
hostname: diamond
# 指定容器名称
container_name: diamond
# 指定服务运行的端口
ports:
- target: 8080
published: 8080
mode: host
# 指定容器中需要挂载的文件
volumes:
- /etc/localtime:/etc/localtime
- /ehooyun/logs/diamond:/var/logs
networks:
- custom_net
networks:
custom_net:
external:
name: net-ehooyun
nginx:
docker-compose-nginx.yml
version: '3'
services:
nginx:
image: nginx
hostname: nginx
#image: nginx:1.19.1-alpine
container_name: nginx
restart: always
privileged: true
environment:
- TZ=Asia/Shanghai
ports:
# - 8080:80
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
#- /ehooyun/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro
- /ehooyun/nginx/conf.d:/etc/nginx/conf.d
- /ehooyun/logs/nginx:/var/log/nginx
- /ehooyun/nginx/dist:/opt/dist:ro
networks:
- net-ehooyun
networks:
net-ehooyun:
external: true
链接方法:
访问的时候通过service名当做hostname访问即可。
比如java项目中写mysql地址就可以直接写mysql代替ip地址:
url: jdbc:mysql://mysql:3306/diamond?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT&allowMultiQueries=true
这样可以实现容器间互通,内网调用无需解析ip,提高速度。
这里发现可以不用指定hostname,这样就默认使用service名称来作为host访问。
docker常用命令:
docker ps // 查看所有正在运行容器
docker stop containerId // containerId 是容器的ID
docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID
docker stop $(docker ps -a -q) // stop停止所有容器
docker rm $(docker ps -a -q) // remove删除所有容器