如今Docker的使用已经非常普遍,特别在一线互联网公司。使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地。
本文详细解释介绍Docker入门相关内容,Docker在微服务体系中的使用。在了解Docker之前我们先考虑几个问题:
1、Docker是什么?2、为什么要使用Docker,它有什么优势?带着这些问题我们来看看下面的内容。
什么是Docker?
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
为什么要使用Docker
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势。
1、更快速的交付和部署
对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2、更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3、更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4、更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
Docker vs VM
从下图可以看出,VM是一个运行在宿主机之上的完整的操作系统,VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中,这使得Docker更加轻量高效,启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善,比如隔离效果不如VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
相关概念
Docker是CS架构,主要有两个概念:
Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互
Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon
了解了Docker的组成,再来了解一下Docker的三个主要概念:
Docker image:镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
Docker container:容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
Docker hub/registry: 共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为 https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。
镜像就相当于打包好的版本,镜像启动之后运行在容器中,仓库就是装存储镜像的地方。
好了,接下来就是具体进行docker实战演练了!!!
这几天学习了docker相关的教程,做个笔记,可以日后查看。
第一节课docker前戏
购买了一台腾讯云的服务器。首先进行了服务器的系统更新:
yum update
第二步,更新内核
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
cat /boot/grub2/grub.cfg
grub2-set-default 'CentOS Linux (4.20.13-1.el7.elrepo.x86_64) 7 (Core)'
第三步,内核更新完成。进行重启:
reboot
通过 uname -r 查看系统的最新版本。
安装挂载磁盘
通过 命令查看系统盘和磁盘:
fdisk -l
fdisk /dev/vdb
mkfs.ext4 /dev/vdb1
4.将数据盘挂载
命令:
mkdir/data
mount /dev/vdb1 /data
第五步:写入硬盘启动信息,下次启动后自动挂载数据盘
echo /dev/vdb1 /data ext4 defaults 0 0 >> /etc/fstab
第二课docker安装及注意事项
接下来就是在购买的云服务器上进行docker的安装。具体步骤如下:
创建一个docker 文件夹: mkdir docker
第一步:下载一个工具类
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
第二步:添加docker源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
第三步,安装docker
yum install -y docker-ce
安装完docker之后,就要启动docker服务了。
systemctl start docker
可以通过以下命令,查看docker服务开启的状态
systemctl status docker
让dokcer服务开启自动启动
systemctl enable docker
查看docker的信息
docker info
查看信息的时候,会发现有报错。如下:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决办法,编辑
vim /etc/sysctl.conf
文件增加下面两行配置
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
然后执行命令:
sysctl -p
查看信息的时候,如果出现报错,如下:
WARNING: IPv4 forwarding is disabled
解决办法,编辑
vim /etc/sysctl.conf
添加一行配置文件
net.ipv4.ip_forward=1
重启docker的命令:
systemctl daemon-reload
systemctl restart docker
下载安装docker -compose。
第一步,下载一个compose上传到服务器,或者使用该地址下载
curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
网速慢,用百度云:链接:https://pan.baidu.com/s/1Dxz-QnxECHW3fLFQjsndag
提取码:uumo
复制这段内容后打开百度网盘手机App,操作更方便哦
第二步:给docker-compose添加可执行权限
chmod +x /usr/local/bin/docker-compose
第三步:
docker-compose --version
如何卸载 docker -compose
rm /usr/local/bin/docker-compose
第三课docker安装 open
https://docs.docker.com/compose/install/
创建 open文件夹 mkdir open
在data挂载盘,进行编辑配置文件
vim docker-compose.yml
version: '2'
services:
open:
cap_add:
- NET_ADMIN
image: kylemanna/open
container_name: open
ports:
- "1194:1194/udp"
restart: always
volumes:
- /data/open:/etc/open
cd 到 open路径下
docker-compose run --rm open o_genconfig -u udp://129.211.130.142
初始化
docker-compose run --rm open o_initpki
这些是提示的输入
Enter PEM pass phrase: 输入123456(你是看不见的)
Verifying - Enter PEM pass phrase: 输入123456(你是看不见的)
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:回车一下
Enter pass phrase for /etc/open/pki/private/ca.key:输入123456 ```
// 开启 open服务
docker-compose up -d open
创建一个客户端用户
docker-compose run --rm open easyrsa build-client-full virtuousOne nopass
Enter pass phrase for /etc/open/pki/private/ca.key:输入123456
把证书导入到virtuousOne.o中
在open中创建文件夹: mkdir cliento
docker-compose run --rm open o_getclient virtuousOne > /data/open/cliento/virtuousOne.o
同时,去云服务控制台开启端口
win客户端下载一个openVPN的连接工具:地址 https://open.net/index.php/open-source/downloads.html
同时,我们把证书下载下来,放到安装在win的conf目录下
docker ps -a
第四课–docker实战-安装mysql、redis
在data目录下创建mysql: mkdir mysql
然后再里面创建配置文件,配置好配置文件
vim my.cnf
[mysqld]
default-time-zone = '+8:00'
max_connections = 1200
thread_cache_size = 100
character_set_server = utf8mb4
#default-storage-engine=INNODB
#init_connect='SET NAMES utf8'
max_allowed_packet=1024M
skip-name-resolve
[mysql]
#default-character-set=utf8
[client]
#default-character-set=utf8
安装mysql
docker run --restart=always --name mysql \
-v /data/docker/mysql/data:/var/lib/mysql -v /data/docker/mysql:/etc/mysql/conf.d \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD='123456' -d mysql:5.7.25 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
设置mysql的版本
将安装到docker的mysql,设置到open的网络中
docker network connect open_default mysql
查看mysql在该容器中的 网络IP
docker exec mysql cat /etc/hosts
查看open的网络IP
docker exec open cat /etc/hosts
本地计算机开启openVPN GUI
然后就可以远程连接mysql.
在mysql中查看设置的配置连接池:
show VARIABLES like ‘%max_connections%’;
安装redis
在data目录下,创建redis文件夹。mkdir redis
docker run --restart=always --name redis -p 6379:6379 -v /data/redis/data:/data -d redis --appendonly yes
安装完成,进行配置redis的open
docker network connect open_default redis
查看redis在open对应的IP
docker exec redis cat /etc/hosts
查看docker对应的open对应的IP
docker exec open cat /etc/hosts
第五课–docker实战-安装nginx,配置https
首先创建 mdkir nginx 。然后继续
在nginx文件夹下创建三个文件建
1.mkdir conf.d
2.mkdir cert
3. mkdir www
下一步,在www目录下编辑index.html
cd www
vim index.html
在nginx中 创建 nginx.conf文件
vim nginx.conf
编辑的内容是:
#user nobody;
user root;
worker_processes 4;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 20480;
}
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;
#下面三行是nginx解决跨域问题
#add_header Access-Control-Allow-Origin *;
# add_header Access-Control-Allow-Headers X-Requested-With;
#add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#关闭显示nginx版本号
server_tokens off;
include /etc/nginx/conf.d/*.conf;
}
在 conf.d中创建 docker.virtuousone.cn.conf文件,编辑的内容为:
server { listen 443 ssl http2 default_server ; server_name docker.virtuousone.cn; index index.html index.htm ; root /usr/share/nginx/html; ssl on; ssl_certificate /etc/nginx/cert/fullchain.pem; ssl_certificate_key /etc/nginx/cert/privkey.pem; ssl_protocols TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; #SSL 会话缓存类型和大小 ssl_buffer_size 1400; # 1400 bytes to fit in one MTU add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; #如果使用这个AES256+EECDH:AES256+EDH:!aNULL 当nginx开启http2的时候,浏览器会访问不了,chrome浏览器报错内容ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY #http://www.chinaz.com/web/2016/0323/515111.shtml 参考这个 #ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; #强烈推荐使用下面这个 ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
# location / { # proxy_pass http://127.0.0.1:5250; # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #} #access_log /home/wwwlogs/access.log; location ~* \.(jpg|jpeg|png|gif|ico|css|js|mp3)$ { expires 30d; }
}
复制文件
cp docker.virtuousone.cn.conf api.virtuousone.cn.conf.bak
docker.virtuousone.cn.conf test.virtuousone.cn.conf.bak
生成证书:
docker run --name certbot -p 443:443 -p 80:80 -v /data/certbot/letsencrypt:/etc/letsencrypt -d certbot/certbot certonly --standalone --agree-tos --non-interactive --email [email protected] -d docker.virtuousone.cn -d api.virtuousone.cn -d test.virtuousone.cn
这个证书的有效期是90天,到期之后,可以更新证书:
docker run --name certbot -p 443:443 -p 80:80 -v /data/docker/certbot/letsencrypt:/etc/letsencrypt -d certbot/certbot certonly renew --force-renew
在域名网站开启二级域名以及 开通443和80端口
进入到cerbot下。的 letsencrypt的live的目录下
cd certbot
ls
cd letsencrypt
ls
cd live
ls
cd docker.virtuousone.cn
ls
复制生成的证书 到cert中
cp fullchain.pem privkey.pem /data/nginx/cert
进入到cert目录下
cd /data/nginx/cert
ls
cd ..
查看 .conf文件
cat conf.d/docker.virtuousone.cn.conf
拉取并启动 nginx
docker run --net host --restart=always --name nginx -e TZ="Asia/Shanghai" -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf -v /etc/localtime:/etc/localtime:ro -v /data/nginx/conf.d:/etc/nginx/conf.d -v /data/nginx/cert:/etc/nginx/cert -v /data/nginx/www:/usr/share/nginx/html -d nginx
在 conf.d中的 docker.virtuousone.cn.conf中
添加一个Server配置
server {
listen 80;
server_name docker.virtuousone.cn ;
#return 301 https://docker.virtuousone.cn$request_uri;
#【这是 nginx 最新支持的写法】
return 301 https://$server_name$request_uri;
#rewrite ^(.*) https://docker.virtuousone.cn$1 permanent;
}
重启nginx服务
docker restart nginx
在浏览器中输入二级域名,就可以看到nginx配置成功的了。
同时,可以在https://www.sslshopper.com/ssl-checker.html
进行检测配置的https的安全级别。
第六课 docker实战-spring boot项目docker容器化的部署
周末学习了下如何在docker中部署spring boot项目。
第一步,是打包。
在data目录下,创建 api文件夹和 test文件夹
mkdir api test
进入api,创建一个Dockerfile文件夹
进行编辑:
vim Dockerfile
里面的内容为:
FROM java:8
MAINTAINER virtuousone <[email protected]>
VOLUME /tmp
ADD docker-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.profiles.active=prod" ]
同理,在test中的Dockerfile中编辑内容:
[root@virtuousOne test]# cat Dockerfile
FROM java:8
MAINTAINER virtuousone <[email protected]>
VOLUME /tmp
ADD docker-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.profiles.active=test" ]
将打包的spring boot项目,传到api文件夹中。
复制一份,到test中
cp docker-0.0.1-SNAPSHOT.jar ../test/
修改在nginx中的nginx.conf的配置:
vim /data/nginx/conf.d/api.virtuousone.cn.conf
修改nginx对应的转发配置(方式一):是根据宿主主机映射端口,进行访问。
server { listen 443 ssl http2; #listen 80; server_name test.virtuousone.cn; index index.html index.htm ; root /usr/share/nginx/html;
ssl_certificate /etc/nginx/cert/fullchain.pem; ssl_certificate_key /etc/nginx/cert/privkey.pem; ssl_protocols TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; #SSL 会话缓存类型和大小 ssl_buffer_size 1400; # 1400 bytes to fit in one MTU add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; #如果使用这个AES256+EECDH:AES256+EDH:!aNULL 当nginx开启http2的时候,浏览器会访问不了,chrome浏览器报错内容ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY #http://www.chinaz.com/web/2016/0323/515111.shtml 参考这个 #ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; #强烈推荐使用下面这个 ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; location / { proxy_pass http://127.0.0.1:10001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #access_log /home/wwwlogs/access.log; location ~* \.(jpg|jpeg|png|gif|ico|css|js|mp3)$ { expires 30d; }
}
改变端口号,就可以写到test中
修改nginx对应的转发配置(方式二):根据容器的IP端口映射访问
1.通过该命令,查询下该项目对应的ID
docker ps -a
docker exec 378cc5f1bee1 cat /etc/hosts
vim /data/nginx/conf.d/test.virtuousone.cn.conf
这样就可以了。另一个环境的也是同理这样解决!
以上两种修改conf.d路径下的test.virtuousone.cn.conf的方式,选择一种即可。
第三步,在docker镜像中执行打包上去的项目:
执行api环境中的:
docker build -t virtuousone/docker-api-springboot:1.0 .
执行test环境中的:
docker build -t virtuousone/docker-test-springboot:1.0 .
分别运行两个环境的项目:
api环境
docker run --restart=always --name docker-springboot -p 10000:8080 -d virtuousone/docker-api-springboot:1.0
test环境
docker run --restart=always --name docker-test-springboot -p 10001:8080 -d virtuousone/docker-test-springboot:1.0
重启nginx容器:
docker restart nginx
查看nginx中的日志:
docker logs -f nginx
如果日志显示正常,就说明已经发布部署城里了。我们可以进行访问了。
删除容器和文件夹,才能删掉我们删掉的安装程序。
删除容器具体命令:
docker rm -f 容器名称或容器id
删除文件夹命令:
rm -rf 文件夹
第七课 基于docker的nginx进行集群部署
基于上一课,这次主要讲解基于nginx的集群部署。
查看之前的容器:
docker ps -a
基于之前放上去的springboot的项目的容器,再进行一个实例化。
docker run --restart=always --name docker-product-springboot -p 10002:8080 -d virtuousone/docker-api-springboot:1.0
可以查看该容器在docker中的ip:
docker exec 70708b55281c cat /etc/hosts
cd /data/nginx/conf.d/
vim api.virtuousone.cn.conf
修改内容如下:
upstream api{
server 127.0.0.1:10000;
server 127.0.0.1:10002;
}
同时,将location中的 proxy_pass 修改为:
proxy_pass http://api;
upstream api{
server 127.0.0.1:10000 weight=1;
server 127.0.0.1:10002 weight=2;
}
其他配置一样,这是第二种配置的方式。
重启ngxin之后,就可以了。集群部署多个项目到此完成了!
进行验证:
可以关闭其中的一个
docker stop 70708b55281c
第八课 docker实战-安装rabbitmq及其使用
在docker目录下创建一个rabbitmq
mkdir rabbitmq
rabbitmq的安装比较简单。
执行命令
docker run --restart=always --name rabbitmq -e RABBITMQ_DEFAULT_USER=admin \
-e TZ="Asia/Shanghai" -e RABBITMQ_DEFAULT_PASS=virtuousone \
-v /data/docker/rabbitmq/rabbitmq-data/:/var/lib/rabbitmq \
-v /etc/localtime:/etc/localtime:ro -d rabbitmq:management
将其网络添加到open中,就可以进行内网使用了。
docker network connect open_default rabbitmq
查看rabbitmq在open对应的IP
docker exec rabbitmq cat /etc/hosts
打开open,就可以先查看Web管理的rabbitmq,即可表示安装成功了。