四台服务器,我这里选用四台虚拟机1核2G,系统centos7,ip:192.168.10.104、 192.168.10.105、 192.168.10.106、 192.168.10.107
三台服务器都执行以下命令
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 开放2377端口
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 2375 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp --dport 4789 -j ACCEPT
service iptables save
firewall-cmd --zone=public --add-port=2377/tcp --permanent #TCP port 2377 用于集群管理节点间通信
firewall-cmd --zone=public --add-port=2375/tcp --permanent #docker服务开启TCP远程管理容器功能,portainer可以使用该端口管理主机上的容器
firewall-cmd --zone=public --add-port=7946/tcp --permanent #TCP 和 UDP 端口号 7946 用于节点间通信
firewall-cmd --zone=public --add-port=4789/tcp --permanent #UDP port 4789 for overlay network traffic,也就是说docker如果使用overlay网络,该端口会用于主机间网络数据包的传输
firewall-cmd --reload
方法一:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
方法二:
setenforce 0
vi /etc/sysconfig/selinux
#将里面的SELINUX配置为disabled SELINUX=disabled
vim /etc/hostname
node1
vim /etc/hostname
node2
vim /etc/hostname
node3
vim /etc/hostname
node4
vim /etc/hosts
192.168.10.104 node1
192.168.10.105 node2
192.168.10.106 node3
192.168.10.107 node4
date #查看时间 (可选)
yum install -y ntpdate
ntpdate time.windows.com #同步最新时间
三台服务器都执行以下命令
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#删除容器镜像:
sudo rm -rf /var/lib/docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://yuma69sd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
可以登录阿里云设置自己加速镜像,用我的也可以。
sudo systemctl start docker
sudo systemctl enable docker
docker version
# 创建外链
docker volume create portainer_data
# 创建Portainer容器
docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
在浏览器中输入http://ip:9000 可以看到效果
#官方镜像文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#国内镜像文件
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
如果网不好,可离线安装
(1) 访问https://github.com/docker/compose/releases,下载 docker-compose-Linux-x86_64,将docker-compose-Linux-x86_64重命名为docker-compose
(2) 将刚才下载的docker-compose文件上传到centos7的/usr/local/bin/目录下
(3) 重命名
mv /usr/local/bin/docker-compose-Linux-x86_64.64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
docker swarm init --advertise-addr ip地址
docker swarm init --advertise-addr 192.168.10.104
docker swarm join 加入一个节点
#获取 创建其加入管理节点token命令
docker swarm join-token manager
#获取 创建其加入工作节点token命令
docker swarm join-token worker
#在其他三个节点执行(token从上面两个命令获取)
docker swarm join --token SWMTKN-1-1gtih3nv8gfch2fdtisx0xg3wbn8yt894r1yyzb6c7hxu4ot4a-0sxc5jaogtao45wa726af9474 192.168.10.104:2377
docker node ls
swarm
集群的管理和编号。docker可以初始化一个swarm集群,其他节点可加入(管理、工作者)
node
就是一个docker节点。多个节点组成了一个网络集群。(管理、工作者)
service
服务,可以在管理节点或者工作节点来运行。当你创建服务的时,你需要指定容器镜像
task
容器内的命令,细节任务
二主二从: 假设一个节点挂了 , 其他节点是否可用呢?
raft协议:保证大多数节点存活才可以用 至少 > 1个节点存活 集群 > 3
实验:
如果将主docker停掉一台,那么另外一台主节点也不能使用。
如果将从docker节点离开集群,集群信息会看到此节点down的状态
work节点只是为了工作,manager节点才是为了管理集群
为了达到集群可用,若三个主节点,必须 > 1台存活的主节点 才可以正常使用。
vim /lib/systemd/system/docker.service
#ExecStart后添加【 -H tcp://0.0.0.0:2375 】
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
#执行命令使它生效
systemctl daemon-reload
service docker restart
#查看端口是否已经监听成功
netstat -nlp |grep 2375
方法一:
# 创建Portainer容器 方法一
docker service create \
--name portainer \
--publish 9000:9000 \
--replicas=1 \
--constraint 'node.role == manager' \
--mount type=volume,src=portainer_data,dst=/data \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer
# 下载protainer官方的yml文件 方法二
curl -L https://downloads.portainer.io/portainer-agent-stack.yml \
-o portainer-agent-stack.yml
# #通过yml文件进行部署
docker stack deploy -c portainer-agent-stack.yml portainer
方法二:
# 下载protainer官方的yml文件 方法二
curl -L https://downloads.portainer.io/portainer-agent-stack.yml \
-o portainer-agent-stack.yml
# #通过yml文件进行部署
docker stack deploy -c portainer-agent-stack.yml portainer
portainer-agent-stack.yml
version: '3.2'
services:
agent:
image: portainer/agent:2.11.1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer-ce:2.11.1
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9443:9443"
- "9000:9000"
- "8000:8000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
在浏览器中输入http://ip:9000 可以看到效果
示例:以nginx为例
# 查看可用版本
docker search nginx
# 获取nginx镜像
docker pull nginx
# 查看镜像
docker images
# 运行容器
docker run --name nginx-test -p 8080:80 -d nginx
# --name nginx-test:容器名称。
# -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
# -d nginx: 设置容器在在后台一直运行。
# 查看运行容器
docker ps
# 进入容器
docker exec -it nginx /bin/bash
# 容器:启动、重启、停止
docker start nginx-test
docker restart nginx-test
docker stop nginx-test
# 删除容器
docker rm nginx-test
# 清理掉所有处于终止状态的容器
docker container prune
编写Dockerfile文件定制镜像
构建镜像
docker build -t nginx:v3 .
# 在 Dockerfile 文件的存放目录下,执行构建动作。
# 以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。
# 注:最后的 . 代表本次执行的上下文路径,下一节会介绍。
docker-compose:官网地址 https://docs.docker.com/compose/
主要就是对多个容器进行编排管理 主要核心就是 编写dockerfile文件构建镜像 以及 编写docker-compose.yml文件
# 部署yaml文件
docker-compose up -d
# 打包重构镜像
docker-compose up --build
常用命令
docker-compose 命令 --help 获得一个命令的帮助
docker-compose up -d nginx 构建启动nignx容器
docker-compose exec nginx bash 登录到nginx容器中
docker-compose down 此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose ps 列出项目中目前的所有容器
docker-compose restart nginx 重新启动nginx容器
docker-compose build nginx 构建镜像
docker-compose build --no-cache nginx 不带缓存的构建
docker-compose top 查看各个服务容器内运行的进程
docker-compose logs -f nginx 查看nginx的实时日志
docker-compose images 列出 Compose 文件包含的镜像
docker-compose config 验证文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose events --json nginx 以json的形式输出nginx的docker日志
docker-compose pause nginx 暂停nignx容器
docker-compose unpause nginx 恢复ningx容器
docker-compose rm nginx 删除容器(删除前必须关闭容器,执行stop)
docker-compose stop nginx 停止nignx容器
docker-compose start nginx 启动nignx容器
docker-compose restart nginx 重启项目中的nignx容器
docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker swarm: 官网地址 https://docs.docker.com/engine/swarm/
主要是对集群的管理和编排 能够轻松实现 动态扩展,动态更新服务 实现动态扩容。 swarm是在docker环境中的扩展。通过初始化swarm,让其他服务器docker节点加入到swarm集群,之后就可以管理节点node从而管理服务service。
# 用于列出 Swarm 中的所有节点及相关信息,包括哪些是管理节点、哪个是主管理节点。
docker node ls
# 管理器节点脱离 docker swarm集群:
docker swarm leave --force
# 工作节点脱离Docker Swarm集群
docker swarm leave
# 创建nginx服务
docker service create -p 8080:80 --name nginx-test nginx
# 查看服务部署情况
docker service ps nginx-test
# 动态扩缩容
docker service scale nginx-test=2
# 删除服务
docker service rm nginx-test
# 集群部署yaml文件
docker stack deploy docker-compose.yml
KuangStudy:https://www.kuangstudy.com/bbs/1405398545049108481
菜鸟教程:https://www.runoob.com/docker/docker-tutorial.html
官网练习 compose一键部署wordpress
https://docs.docker.com/samples/wordpress/
编写docker-compose.yml
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "627:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
执行安装部署命令
# 单机部署
docker-compose up -d
# 集群部署
docker stack deploy docker-compose.yml my_wordpress
(1)编写Dockerfile
FROM java:8
EXPOSE 88
VOLUME /tmp
ADD *.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
(2)编写docker-compose.yml
version: '2'
services:
#1.gateway
gateway:
container_name: gateway
build: ./gateway
image: gateway
mem_limit: 512M
restart: always
ports:
- "88:88"
# environment:
# - spring.profiles.active=dev
#2.auth
auth:
container_name: auth
build: ./auth
image: auth
mem_limit: 512M
restart: always
ports:
- "8080:8080"
#environment:
# - spring.profiles.active=dev
执行安装部署命令
# 单机部署
docker-compose up -d
# 集群部署
docker stack deploy docker-compose.yml my_wordpress