背景 环境(切换/配置)麻烦 项目(产品)过程中,有如下3个环境:
研发写代码的环境叫做开发环境。
测试进行验证的环境叫做测试环境。
用户部署使用的环境叫做生产环境。
其实在很多时候,大量的时间浪费在了环境上。
如果我现在重装了系统,我想要跑我的jar包,我得去安装一下JDK、Tomcat、MySQL等,并配置各种环境变量才能跑起来。
好不容易开发环境没问题了,但是到测试环境就是各种bug。
好不容易在测试环境验证通过了,但是在生产环境就各种出错。
应用之间需要隔离 比如有两个web应用,这两个应用部署在同一台服务器上,那可能会出现什么问题?
使用Docker 进行解决
将一整套环境打包封装成镜像,无需重复配置环境,解决环境带来的种种问题。从开发的角度来看就是三步走:构建,发布,运行。其中关键步骤就是构建环节,即打包镜像文件。从测试和运维的角度来看,那就只有两步:复制,运行。有了这个镜像,那么想复制到哪运行都可以,完全和平台无关了。
Docker容器间是进程隔离的,相互之间互不影响
Docker的性能几乎和原生系统无异,并且系统支持量很高。
概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker是容器虚拟化技术,可以有多个容器(可以不同功能)且相互隔离,互不影响。容器没有自己的内核,直接运行于宿主主机的内核。
Docker优点
简化程序: Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管 理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的任务,在Docker容器的处理下,只需要数秒就 能完成。
避免选择恐惧症: 如果你有选择恐惧症,还是资深患者。Docker 帮你打包你的纠结!比如 Docker 镜像;Docker 镜 像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应 用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
节省开支: 一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高 价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化 的方式。
容器和虚拟机 Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
安装 在线安装 安装详细说明参考官方文档:https://docs.docker.com/get-docker ,以 CentOS 7为例。
Docker 要求操作系统必须为64位,且centos内核版本为3.1及以上。
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 37 38 39 40 41 42 43 44 45 46 47 48 uname -r yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine yum install -y yum-utils yum-config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io systemctl start docker docker version systemctl status docker systemctl stop docker systemctl restart docker systemctl enable docker docker system df docker stats -a docker stats nginx
离线安装 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 链接:https://pan.baidu.com/s/1S7B1PUxsybCT-BTGBM19OA?pwd =i65a 提取码:i65a tar -zxvf docker-19.03.9.tgz cd dockercp * /usr/bin cp docker.service /etc/systemd/system systemctl start docker docker version systemctl status docker systemctl stop docker systemctl restart docker systemctl enable docker
配置镜像加速 Docker
默认拉取镜像是从 https://hub.docker.com 拉取,国外地址拉取的速度比较慢。我们也可以配置国内镜像源,比如阿里云镜像加速器。访问地址 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors ,复制加速器地址,如:https://xxxxxx.mirror.aliyuncs.com。
1 2 3 4 5 6 7 8 9 10 11 12 13 mkdir -p /etc/docker vim /etc/docker/daemon.json { "registry-mirrors" : [ "https://ung2thfc.mirror.aliyuncs.com" ] } systemctl daemon-reload systemctl restart docker
下面列出国内常用的加速站点,排名不分先后,总体来说阿里云速度较稳定。
docker中国区官方镜像加速:
https://registry.docker-cn.com
网易镜像加速:
http://hub-mirror.c.163.com
中国科技大学镜像加速:
https://docker.mirrors.ustc.edu.cn
腾讯云镜像加速:
https://mirror.ccs.tencentyun.com
阿里云镜像加速:
https://ung2thfc.mirror.aliyuncs.com
镜像命令 官方文档:https://docs.docker.com/reference
查看镜像 1 2 3 4 5 6 7 8 9 10 11 12 docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 5.7 938b57d64674 3 weeks ago 448MB redis 6.2.6 7faaec683238 5 weeks ago 113MB nginx 1.20.1 c8d03f6b8b91 4 weeks ago 133MB nacos/nacos-server 2.0.3 433eb51fef8d 3 months ago 1.05GB
这些镜像默认都是存储在 Docker 宿主机的 /var/lib/docker
目录下。
搜索镜像 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 15800 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 2093 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 818 [OK] jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 273 linuxserver/nginx An Nginx container, brought to you by LinuxS… 159 tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 144 [OK]
拉取镜像 拉取镜像就是从中央仓库下载镜像到本地。
1 2 3 docker pull 镜像名:TAG docker pull nginx:1.20.1
删除镜像 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 docker rmi -f 镜像ID或者镜像名:TAG docker rmi c8d03f6b8b91 docker rmi c8d03f6b8b91 938b57d64674 7faaec683238 docker rmi $(docker images -aq) docker images | grep 'nginx' | awk '{print $3}' | xargs docker rmi
注意:如果通过某个镜像创建了容器,则该镜像无法删除。解决办法:先删除镜像中的容器,再删除该镜像。
导出镜像 1 2 3 4 docker save mynginx -o /exp/mynginx.tar docker rmi mynginx docker images
导入镜像 1 2 docker load -i /exp/mynginx.tar docker images
获取元信息: 1 2 docker inspect 镜像ID或者镜像名:TAG
容器命令 查看容器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abe0cf621fed redis:6.2.6 "docker-entrypoint.s…" 21 seconds ago Up 20 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp a27fdaf5fbd8 nginx:1.20.1 "/docker-entrypoint.…" 2 days ago Up 2 days 0.0.0.0:80->80/tcp, :::80->80/tcp nginx 7fbcd08dd3a7 mysql:5.7 "docker-entrypoint.s…" 2 days ago Up 2 days 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql 80912a86d5f1 nacos/nacos-server:2.0.3 "bin/docker-startup.…" 2 days ago Up 2 days 0.0.0.0:8848->8848/tcp, :::8848->8848/tcp nacos docker ps -a docker ps -f status=exited docker inspect nginx
创建启动进入退出容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像ID或镜像名:TAG docker run -di --name nginx -p 80:80 nginx:1.20.1 docker exec -it nginx /bin/bash docker run -dit --name nginx -p 80:80 nginx:1.20.1 /bin/bash exit
停止与启动容器 1 2 3 4 5 6 7 8 9 10 11 docker stop nginx docker start nginx docker kill nginx docker stop $(docker ps -aq)
删除容器 1 2 3 4 5 6 7 8 9 10 11 docker rm nginx docker rm nginx mysql docker rm $(docker ps -aq) docker ps -a | grep "nginx" | awk '{print $1}' | xargs docker rm
文件拷贝 1 2 3 4 5 docker cp /home/nginx/conf nginx:/etc/nginx docker cp nginx:/etc/nginx /home/nginx/conf
目录挂载 我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。
但是容器被删除的时候,宿主机的内容并不会被删除。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。
1 2 3 4 docker run -di --name nginx -p 80:80 -v /home/nginx/conf:/etc/nginx nginx:1.20.1
提示:目录挂载操作可能会出现权限不足的提示。这是因为 CentOS7 中的安全模块 SELinux 把权限禁掉了,在 docker run
时通过 --privileged=true
给该容器加权限来解决挂载的目录没有权限的问题。
查看容器的 IP 地址 1 2 3 4 5 docker inspect nginx docker inspect --format='{{.NetworkSettings.IPAddress}}' nginx
查看容器的日志 1 2 3 4 5 docker logs nginx docker logs nginx -f
应用部署 Nacos 1 2 3 docker pull nacos/nacos-server:2.0.3 docker run -di --name nacos -p 8848:8848 --env MODE=standalone nacos/nacos-server:2.0.3
Nginx 1 2 3 4 5 6 docker pull nginx mkdir -p /home/nginx/conf /home/nginx/html /home/nginx/logs vi /home/nginx/conf/nginx.conf
启动
1 2 3 4 5 6 7 8 9 10 11 docker run --name nginx -p 80:80 -d --net bridge \ -v /home/nginx/html:/usr/share/nginx/html \ -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /home/nginx/logs:/var/log /nginx \ nginx docker exec -it nginx /bin/bash docker update nginx --restart=always
MySQL 1 2 3 4 5 6 docker pull mysql:5.7 mkdir -p /home/mysql/conf /home/mysql/data /home/mysql/log vi /home/mysql/conf/my.conf
配置文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 [client] default-character-set = utf8 [mysql] default-character-set = utf8 [mysqld] init_connect=' SET collation_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
启动重启
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 docker run -p 3306:3306 --name mysql \ -v /home/mysql/conf:/etc/mysql/ \ -v /home/mysql/log :/var/log /mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7 docker exec -it mysql /bin/bash docker restart mysql docker exec -it mysql /bin/bash cat /etc/mysql/my.conf docker update mysql --restart=always
Redis 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 docker pull redis mkdir -p /home/redis/data vi /home/redis/redis.conf appendonly yes docker run -p 6379:6379 --name redis \ -v /home/redis/data:/data \ -v /home/redis/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf docker exec -it redis redis-cli docker update redis --restart=always
RabbitMQ 1 2 3 4 5 6 docker pull rabbitmq:3.8.25 docker run -di --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.8.25 docker exec -it rabbitmq /bin/bash rabbitmq-plugins enable rabbitmq_management
Elasticsearch 1 2 3 4 5 6 7 8 9 10 11 12 13 docker pull elasticsearch:7.14.2 mkdir -p /home/elasticsearch/plugins /home/elasticsearch/data sysctl -w vm.max_map_count=262144 docker run -di --name elasticsearch -p 9200:9200 -p 9300:9300 -v /home/elasticsearch/plugins:/usr/share/elasticsearch/plugins -v /home/elasticsearch/data:/usr/share/elasticsearch/data -e "discovery.type=single-node" -e "cluster. elasticsearch:7.14.2 # 进入 Elasticsearch 容器,并安装中文分词器 IKAnalyzer docker exec -it elasticsearch /bin/bash elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.2/elasticsearch-analysis-ik-7.14.2.zip # 重启 Elasticsearch 容器 docker restart elasticsearch
Logstash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 docker pull logstash:7.14.2 mkdir -p /home/logstash docker run -di --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 -v /home/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --link elasticsearch:es logstash:7.14.2 docker exec -it logstash /bin/bash logstash-plugin install logstash-codec-json_lines docker restart logstash
Kibana 1 2 3 docker pull kibana:7.14.2 docker run -di --name kibana -p 5601:5601 --link elasticsearch:es -e "elasticsearch.hosts=http://es:9200" kibana:7.14.2
MongoDB 1 2 3 docker pull mongo:5.0.3 mkdir -p /home/mongo docker run -di --name mongo -p 27017:27017 -v /home/mongo/db:/data/db mongo:5.0.3
构建镜像 1 2 3 4 5 docker build -t helloword:1.0.0 . docker build -f /home/docker/Dockerfile -t helloword:1.0.0 .
编写 Dockerfile 文件 vi Dockerfile
:
1 2 3 4 5 6 7 8 9 10 11 12 FROM java:8 ADD zmall-admin-1.0-SNAPSHOT.jar /home/zmall RUN bash -c 'touch /home/zmall/zmall-admin.jar' EXPOSE 8080 ENTRYPOINT ["java" , "-jar" ,"/home/zmall/zmall-admin.jar" ] MAINTAINER cxy35
1 2 3 4 5 6 7 8 9 10 11 12 13 cd /home/zmalldocker build -f /home/zmall/Dockerfile -t zmall/zmall-admin:1.0 . docker run -di --name zmall-admin -p 8080:8080 zmall/zmall-admin:1.0 docker exec -it zmall-admin /bin/bash docker history zmall/zmall-admin:1.0
参考
https://www.cxy35.com/#/docs/tool/docker