Docker 概念
Docker 是一个开源的应用容器引擎
诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc)
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
容器是完全使用沙箱机制,相互隔离。
容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
docker容器虚拟化 与 传统虚拟机比较
相同:
容器和虚拟机具有相似的资源隔离和分配优势
不同:
容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
安装Docker
Docker可以运行在MAC、Windows、CentOS、UBUNTU等操作系统上,本课程基于
CentOS 7 安装Docker。官网:https://www.docker.com
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
Docker 架构
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker 主机(Host) : 个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Machine : Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。
配置 Docker 镜像加速器
默认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢。
一般都会配置镜像加速器:
USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
阿里云
网易云
腾讯云
阿里云为例:
mkdir -p /etc/docker
vi /etc/docker/daemon.json
daemon.json内容如下:
{
"registry-mirrors": ["https://k03gsl1f.mirror.aliyuncs.com"]
}
重启
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker命令
进程相关命令
启动docker服务:
systemctl start docker
停止docker服务:
systemctl stop docker
重启docker服务:
systemctl restart docker
查看docker服务状态:
systemctl status docker
设置开机启动docker服务:
systemctl enable docker
查看已安装的docker软件包
yum list installed | grep docker
卸载已安装的docker软件包
yum removw 软件包名 -y(避免反复确认)
删除docker数据和配置文件
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
rm -rf /etc/dokcer
镜像相关命令
查看镜像: 查看本地所有的镜像
docker images
docker images -q # 查看所用镜像的id
搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub(https://hub.docker.com/) 或者Dao Cloud(http://hub.daocloud.io/)搜索对应镜像查看。
docker pull 镜像名称
删除镜像: 删除本地镜像
docker rmi 镜像id # 删除指定本地镜像
docker rmi `docker images -q` # 删除所有本地镜像
容器相关命令
查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器
创建&运行容器
docker run 参数
参数说明:
-i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器不会关闭。
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器。
--name:为创建的容器命名。
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--network:指定网络。
docker run -p 主机(宿主)端口:容器端口 --name 容器名字 -d 镜像:版本
进入容器
docker exec -it 容器id /bin/bash # 退出容器,容器不会关闭
启动容器
docker start 容器名称
停止容器
docker stop 容器名称
删除容器
docker rm 容器名称
查看容器信息
docker inspect 容器名称
查看网络列表
docker network ls
查看容器网络
docker network inspect 网络名字
从容器拷贝数据到宿主机
docker cp 容器:文件路径 宿主机文件路径
从宿主机拷贝数据到容器
docker cp 宿主机文件路径 容器:文件路径
查看容器日志
docker logs 容器名称 -f
Docker远程连接
进入/usr/lib/systemd/system/docker.service文件
打开该文件,将原来的 ExecStart 前面加上#号注释掉,在该行下面添加
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
重载配置
systemctl daemon-reload
重启docker服务
systemctl restart docker.service
如果有防火墙则打开2375端口
idea下载docker插件
Docker 容器的数据卷
数据卷概念及作用
数据卷
数据卷是宿主机中的一个目录或文件
当容器目录和数据卷目录绑定后,对方的修改会立即同步
一个数据卷可以被多个容器同时挂载
一个容器也可以被挂载多个数据卷
数据卷作用
容器数据持久化
外部机器和容器间接通信
容器之间数据交换
配置数据卷
创建启动容器时,使用 -v 参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
注意事项:
1. 目录必须是绝对路径
2. 如果目录不存在,会自动创建
3. 可以挂载多个数据卷
配置数据卷容器
多容器进行数据交换
多个容器挂载同一个数据卷
数据卷容器
创建启动c3数据卷容器,使用 -v 参数 设置数据卷
docker run -it -d --name=c3 -v /data:/data centos:7 /bin/bash
创建启动 c1 c2 容器,使用 --volumes-from 参数 设置数据卷
docker run -it -d --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it -d --name=c2 --volumes-from c3 centos:7 /bin/bash
数据卷小结
数据卷概念
宿主机的一个目录或文件
数据卷作用容器数据持久化客户端和容器数据交换容器间数据交换
数据卷容器创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )。通过简单方式实现数据卷配置
Docker 网络
四种网络模式
Bridge模式
默认模式,可以简单理解为NAT模式(并不是vmware桥接模式),容器之间独立一个虚拟网络。
语法:
docker run --net=bridge -itd --name redis-test redis
默认就是此模式,因此不加--net=bridge也可以
Host 模式
简单理解,容器和宿主机公用一个网络,并且使用同一个网卡,也就是同一个ip。
语法:
docker run --net=host -itd --name redis-test redis
Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
语法:
docker run --net=container:容器id -itd --name redis-test redis
None 模式
没有网络,连网卡都没有,因此没有ip。
语法:
docker run --net=none -itd --name redis-test redis
查看网络
docker network ls
创建自定义网络
docker network create --driver bridge 网络名字
查看网络详情
docker network inspect 网络名字
Docker 应用部署
端口映射
容器内的网络服务和外部机器不能直接通信
外部机器和宿主机可以直接通信
宿主机和容器可以直接通信
当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的
端口上。外部机器访问宿主机的该端口,从而间接访问容器的服务。
这种操作称为:端口映射
Docker 安装 Nginx
Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务 。
查看可用的 Nginx 版本
访问 Nginx 镜像库地址: https://hub.docker.com/_/nginx?tab=tags。
可以通过 Sort by 查看其他版本的 Nginx,默认是最新版本 nginx:latest。
你也可以在下拉列表中找到其他你想要的版本:
此外,我们还可以用 docker search nginx 命令来查看可用版本:
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 3260 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 674 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 207 [OK]
million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 67 [OK]
maxexcloo/nginx-php Docker framework container with Nginx and ... 57 [OK]
...
取最新版的 Nginx 镜像
这里我们拉取官方的最新版本的镜像:
$ docker pull nginx:latest
查看本地镜像
使用以下命令来查看是否已安装了 nginx:
$ docker images
在上图中可以看到我们已经安装了最新版本(latest)的 nginx 镜像。
运行容器
安装完成后,我们可以使用以下命令来运行 nginx 容器:
docker run --name nginx -d -p 80:80 nginx
参数说明:
--name nginx:容器名称。
-p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
-d nginx: 设置容器在在后台一直运行。
如果为了方便编辑配置和发布静态资源,可以挂载数据卷
创建文件夹
cd /opt
mkdir nginx
cd nginx
mkdir conf conf.d html logs
vi /opt/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
vi /opt/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name 42.193.49.238;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#修改默认发布路径
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
启动容器
docker run --name nginx -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/logs:/var/log/nginx -v /opt/nginx/conf.d:/etc/nginx/conf.d nginx
打开防火墙
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
安装成功
最后我们可以通过浏览器可以直接访问 80端口的 nginx 服务:
Docker 安装 MySQL
MySQL 是世界上最受欢迎的开源数据库。凭借其可靠性、易用性和性能,MySQL 已成为 Web 应用程序的数据库优先选择。
查看可用的 MySQL 版本
访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags 。
可以通过 Sort by 查看其他版本的 MySQL,默认是最新版本 mysql:latest 。
你也可以在下拉列表中找到其他你想要的版本:
此外,我们还可以用 docker search mysql 命令来查看可用版本:
$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati... 2529 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea... 161 [OK]
centurylink/mysql Image containing mysql. Optimized to be li... 45 [OK]
sameersbn/mysql 36 [OK]
google/mysql MySQL server for Google Compute Engine 16 [OK]
appcontainers/mysql Centos/Debian Based Customizable MySQL Con... 8 [OK]
marvambass/mysql MySQL Server based on Ubuntu 14.04 6 [OK]
drupaldocker/mysql MySQL for Drupal 2 [OK]
azukiapp/mysql Docker image to run MySQL by Azuki - http:... 2 [OK]
...
拉取 MySQL 镜像
这里我们拉取官方的最新版本的镜像:
$ docker pull mysql:5.7.38
查看本地镜像
使用以下命令来查看是否已安装了 mysql:
$ docker images
在上图中可以看到我们已经安装了最新版本(latest)的 mysql 镜像。
编辑配置
mkdir -p /opt/mysql/conf
mkdir -p /opt/mysql/data
mkdir -p /opt/mysql/logs
vi /opt/mysql/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET conllation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
运行容器
docker run --restart=always -p 3306:3306 --name mysql -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/logs:/var/log/mysql -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='qweQWE123!@#' -d mysql:5.7.38 --lower_case_table_names=1
参数说明:
--restart=always : docker重启后容器启动。
-v :挂载数据卷,保证容器数据持久化,当删除容器后,数据依然存在。
-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
MYSQL_ROOT_PASSWORD='qweQWE123!@#':设置 MySQL 服务 root 用户的密码。
安装成功
通过 docker ps 命令查看是否安装成功:
进入容器
[root@localhost ~]# docker exec -i -t mysql /bin/bash
root@ddb263349218:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.21 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> alter user 'root'@'%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.01 sec)
Docker 安装 Redis
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 的 NoSQL 数据库,并提供多种语言的 API。
查看可用的 Redis 版本
访问 Redis 镜像库地址: https://hub.docker.com/_/redis?tab=tags。
可以通过 Sort by 查看其他版本的 Redis,默认是最新版本 redis:latest。
你也可以在下拉列表中找到其他你想要的版本:
此外,我们还可以用 docker search redis 命令来查看可用版本:
$ docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source ... 2321 [OK]
sameersbn/redis 32 [OK]
torusware/speedus-redis Always updated official ... 29 [OK]
bitnami/redis Bitnami Redis Docker Image 22 [OK]
anapsix/redis 11MB Redis server image ... 6 [OK]
webhippie/redis Docker images for redis 4 [OK]
clue/redis-benchmark A minimal docker image t... 3 [OK]
williamyeh/redis Redis image for Docker 3 [OK]
unblibraries/redis Leverages phusion/baseim... 2 [OK]
greytip/redis redis 3.0.3 1 [OK]
servivum/redis Redis Docker Image 1 [OK]
...
取最新版的 Redis 镜像
这里我们拉取官方的最新版本的镜像:
$ docker pull redis:latest
查看本地镜像
使用以下命令来查看是否已安装了 redis:
$ docker images
在上图中可以看到我们已经安装了最新版本(latest)的 redis 镜像。
运行容器
安装完成后,我们可以使用以下命令来运行 redis 容器:
$ docker run -itd --name redis -p 6379:6379 redis --requirepass 'qweQWE123!@#'
参数说明:
-p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。
安装成功
最后我们可以通过 docker ps 命令查看容器的运行信息:
接着我们通过 redis-cli 连接测试使用 redis 服务。
$ docker exec -it redis /bin/bash
编辑容器种配置文件
很多时候,我们需要在容器中修改配置文件,比如mysql的配置文件。
方法1:从容器中拷贝到宿主机,利用宿主机的vim编辑器编辑,编辑好后再拷贝到容器。
docker cp 容器:文件路径 宿主机文件路径
docker cp 宿主机文件路径 容器:文件路径
方法2:在容器中安装vim编辑器直接需改(巨慢)。
apt-get update
apt-get install vim
docker restart
Dockerfile
Docker 镜像原理
思考:
Docker 镜像本质是什么?
Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
操作系统组成部分:
进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统
网络通信子系统
作业控制子系统
Linux文件系统由bootfs和rootfs两部分组成
bootfs:包含bootloader(引导加载程序)和 kernel(内核)
rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
Docker镜像是由特殊的文件系统叠加而成
最底端是 bootfs,并使用宿主机的bootfs
第二层是 root文件系统rootfs,称为base image
然后再往上可以叠加其他的镜像文件
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
思考:
1.Docker 镜像本质是什么?
是一个分层文件系统
2.Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,自己只有rootfs和其他镜像层
3.Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB
镜像制作
Docker 镜像如何制作?
1.容器转为镜像
docker commit 容器id 镜像名称:版本号
docker save 镜像名称:版本号 | gzip > <myimage>_<tag>.tar.gz 导出镜像
gunzip -c <myimage>_<tag>.tar.gz | docker load 导入镜像
2.dockerfile
Dockerfile概念及作用
Dockerfile 是一个文本文件
包含了一条条的指令
每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
对于开发人员:可以为开发团队提供一个完全一致的开发环境
对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
对于运维人员:在部署时,可以实现应用的无缝移植
Dochub网址:https://hub.docker.com
Dockerfile关键字
案例
案例1
需求
自定义centos7镜像。要求:
默认登录路径为 /usr
可以使用vim
实现步骤
定义父镜像:FROM centos:7
定义作者信息:MAINTAINER yaorange yaorange2019@sina.com
执行安装vim命令: RUN yum install -y vim
定义默认的工作目录:WORKDIR /usr
定义容器启动执行的命令:CMD /bin/bash
通过dockerfile构建镜像:docker bulid -f dockerfile绝对路径 . -t 镜像名称:版本
FROM centos:7
MAINTAINER yaorange yaorange2019@sina.com
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
docker build -t 镜像名称:版本 . #在当前目录下有Dockerfile
或
docker build -f Dockerfile绝对路径 . -t 镜像名称:版本 #-f指定绝对路径
#创建容器
docker run -itd --name mycentos mycentos:1.0
#进入容器
docker exec -it mycentos /bin/bash
常见错误:
解决方法:
vim /etc/resolv.conf ,新增内容
nameserver 8.8.8.8
nameserver 8.8.4.4
案例2
需求
定义dockerfile,发布springboot项目
实现步骤
定义父镜像:FROM java:8
定义作者信息:MAINTAINER yaorange yaorange2019@sina.com
将jar包添加到容器: ADD springboot.jar app.jar
定义容器启动执行的命令:CMD java -jar app.jar
通过dockerfile构建镜像:docker bulid -f dockerfile文件路径 -t 镜像名称:版本
FROM java:8
MAINTAINER yaorange yaorange2019@sina.com
ADD springboot.jar springboot.jar
CMD java -jar springboot.jar
docker build -t app:1.0 . #构建镜像
docker run -it -p 8080:8080 -d --name app --link mysql --link redis app:1.0 #构建容器
Docker 服务编排
服务编排概念
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
要从Dockerfile build image 或者去dockerhub拉取image
要创建多个container
要管理这些container(启动停止删除)
服务编排:按照一定的业务规则批量管理容器
Docker Compose 概述
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。
使用步骤:
利用 Dockerfile 定义运行环境镜像
使用 docker-compose.yml 定义组成应用的各服务
运行 docker-compose up 启动应用
Docker Compose 安装使用
1.安装Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 加速地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
2.卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
3.使用docker compose编排nginx+springboot项目,并实现负载均衡
创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
创建文件夹
mkdir nginx
cd nginx
mkdir conf conf.d html logs
vi /root/docker-compose/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
vi /root/docker-compose/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#修改默认发布路径
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
编写 docker-compose.yml 文件
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- jee
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
app1:
image: app:2.0
expose:
- "8080"
app2:
image: app:2.0
expose:
- "8080"
networks:
default:
external:
name: mybridge #这里可以选择和mysql同一个网络
在./nginx/conf目录下 编写nginx.conf文件
vi nginx.conf
upstream lbapp {
server app1:8080;
server app2:8080;
}
server {
listen 80;
access_log off;
# / 所有请求
location / {
proxy_pass http://lbapp;
}
}
在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
测试访问
http://192.168.249.148/halo
Docker 私有仓库
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像 到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜 像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
搭建私有仓库
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、配置域名registry
vi /etc/hosts #添加主机名映射
127.0.0.1 registry
# 5、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["registry:5000"]}
# 6、将daemon.json 改成 daemon.conf
mv /etc/docker/daemon.json /etc/docker/daemon.conf
# 7、重启docker 服务
systemctl restart docker
docker start registry
将镜像上传至私有仓库
# 1、标记镜像为私有仓库的镜像
docker tag redis:latest registry:5000/redis:latest
# 2、上传标记的镜像
docker push registry:5000/redis:latest
从私有仓库拉取镜像
#拉取镜像
docker pull registry:5000/redis:latest