简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
架构
- Docker_Host: ○ 安装Docker的主机
- Docker Daemon: ○ 运行在Docker主机上的Docker后台进程
- Client: ○ 操作Docker主机的客户端(命令行、UI等)
- Registry: ○ 镜像仓库 ○ Docker Hub
- Images: ○ 镜像,带环境打包好的程序,可以直接启动运行
- Containers: ○ 容器,由镜像启动起来正在运行中的程序
Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。 Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
4、个人理解
Docker 可理解为是一个独立的Linux操作系统。
安装
参考官方文档 docs.docker.com/engine/inst…
1、移除以前docker相关包
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
## 1.检查 docker 版本
docker -v
## 2.查看 docker 已有镜像
sudo docker images
## 3.设置 docker 开机启动
sudo systemctl enable docker
4、启动
systemctl enable docker --now
5、配置加速
这里额外添加了docker的生产环境核心配置cgroup
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker常用命令
# 查看本地所以镜像
docker images
# 查看正在运行的容器
docker ps
# 查看所有
docker ps -a
# 删除停止的容器
docker rm 容器id/名字
docker rm -f 容器id/名字 # 强制删除正在运行中的
#停止容器
docker stop 容器id/名字
#再次启动
docker start 容器id/名字
#应用开机自启
docker update 容器id/名字 --restart=always
# 查看容器日志
docker logs 容器名/id
实战
1、找镜像
去docker hub,找到nginx镜像 docker hub地址:hub.docker.com/
docker pull nginx #下载最新版
## 下载指定版本镜像名:版本名(标签)
docker pull nginx:1.20.1
docker pull redis #下载最新
docker pull redis:6.2.4
## 下载来的镜像都在本地
docker images #查看所有镜像
##删除镜像
docker rmi 镜像名:版本号/镜像id
2、启动容器
启动nginx应用容器,并映射88端口,测试的访问
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
【docker run 设置项 镜像名 】 镜像启动运行的命令(镜像里面默认有的,一般不会写)
# -d:后台运行
# -p:端口映射(容器内的端口映射到本机的端口)
# --restart=always: 开机自启
docker run --name=mynginx -d --restart=always -p 88:80 nginx
3、修改容器内容
修改默认的index.html 页面
1、进入容器内部修改
# 进入容器内部的系统,修改容器内容
docker exec -it 容器id /bin/bash
2、挂载数据到外部修改
docker run --name=mynginx \
-d --restart=always \
-p 88:80 \
-v /data/html:/usr/share/nginx/html:ro \
nginx
## -v: 文件挂载,本地文件与容器内部文件进行关联(这样,我们在修改本地文件的同时,容器内的文件也会被同时修改,一般我们会把配置文件和数据文件挂载出来,这样我们就不需要进入容器内部去修改常用配置了)
# 修改页面只需要去
主机的 /data/html
4、镜像提交
将自己修改好的镜像提交
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "petrichor" -m "首页变化" 341d81f7504f petrichornginx:v1.0
1、镜像传输
本地传输(以压缩包的形式传输)
# 将镜像保存成压缩包
docker save -o abc.tar petrichornginx:v1.0
# 别的机器加载这个镜像
docker load -i abc.tar
# 离线安装
5、推送远程仓
推送镜像到docker hub;应用市场 地址:hub.docker.com/ 需要登录以后才能有自己的储存库,(可以理解为github或gieee)
# 把旧镜像的名字,改成仓库要求的新版名字
docker tag petrichornginx:v1.0 petrichor/petrichornginx:v1.0
# 登录到docker hub
docker login
docker logout(推送完成镜像后退出)
# 推送
docker push petrichor/petrichornginx:v1.0
# 别的机器下载
docker pull petrichor/petrichornginx:v1.0
6、补充
## 查看容器运行日志
docker logs 容器名/id # 排错
docker exec -it 容器id /bin/bash
## docker 经常修改nginx配置文件
docker run -d -p 80:80 \
-v /data/html:/usr/share/nginx/html:ro \
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf \
--name mynginx-02 \
nginx
## 把容器指定位置的东西复制出来
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf /data/conf/nginx.conf
## 把外面的内容复制到容器里面
docker cp /data/conf/nginx.conf 5eff66eec7e1:/etc/nginx/nginx.conf
进阶实战
1、编写自己的应用
使用SpringBoot 编写一个HelloWorld应用,(并打成一个jar包)
2、将应用打包成镜像
编写Dockerfile将自己的应用打包镜像
1、以前部署项目的方式
以Java为例
- SpringBoot打包成可执行jar
- 把jar包上传给服务器
- 服务器运行 java -jar
2、现在
所有机器都安装Docker,任何应用都是镜像,所有机器都可以运行
3、怎么打包-编写Dockerfile文件
## 安装基础环境
FROM openjdk:8-jdk-slim
## 给个名字,让别人知道这个镜像是谁发布的
LABEL maintainer=petrichor
## 把当前目录的jar包复制的容器内,并改名为app.jar
COPY target/*.jar /app.jar
## 容器启动后的最后命令
ENTRYPOINT ["java","-jar","/app.jar"]
4、构建镜像
docker build -t java-demo:v1.0 .
5、启动容器
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0
这个时候就可以通过服务器ip地址去访问8080端口看效果了。
分享镜像
# 登录docker hub
docker login
#给旧镜像起名
docker tag java-demo:v1.0 petrichor/java-demo:v1.0
# 推送到docker hub
docker push petrichor/java-demo:v1.0
# 别的机器下载
docker pull petrichor/java-demo:v1.0
# 别的机器运行
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0
部署基本环境/中间件
1. docker 安装 redis
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
## redis使用自定义配置文件启动
##1、拉取redis镜像
docker pull redis
## 创建 redis 配置文件挂载目录
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
## 启动 redis 容器
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
## 配置 redis 持久化
echo "appendonly yes" >> /mydata/redis/conf/redis.conf
# 重启生效
docker restart redis
## 容器随 docker 启动自动运行
# redis
docker update redis --restart=always
docker 安装 mysql
docker run -d \
--name mysql8 \
--privileged=true \
--restart=always \
-p 3310:3306 \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/config:/etc/mysql/conf.d \
-v /mydata/mysql/logs:/logs \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai mysql \
--lower_case_table_names=1
docker 安装 RocketMQ
#下载并启动rocketmq
docker run -d -p 9876:9876 --name rmqserver foxiswho/rocketmq:server-4.5.1
##创建broker.conf
brokerIP1 = 192.168.109.128
listenPort = 10911
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
##创建并启动 Broker
docker run -d -p 10911:10911 -p 10909:10909 \
--name rmqbroker --link rmqserver:namesrv \
-e "NAMESRV_ADDR=namesrv:9876" -e \
"JAVA_OPTS=-Duser.home=/opt" -e \
"JAVA_OPT_EXT=-server -Xms128m -Xmx128m" \
-v /usr/local/rocketmq/conf/broker.conf:/etc/rocketmq/broker.conf foxiswho/rocketmq:broker-4.5.1
## docker安装RocketMQ可视化管理页面
docker run -d --name rmqconsole -p 8180:8080 --link rmqserver:namesrv \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-t styletang/rocketmq-console-ng
docker安装 nginx
## 搜索镜像命令,会列出所有的可下载的镜像
docker search nginx
## 拉取镜像
docker pull nginx # 不加版本号 默认拉取最新版
docker pull nginx:[tag] # : 号 后面就可以加版本号 如 nginx:1.16.1 这种,但需要确定它是存在过的版本号才可以。
## 宿主机创建好要挂载的目录 -p 参数的作用就是允许创建多级目录
mkdir -p /mydata/nginx/
mkdir -p /mydata/nginx/logs
mkdir -p /mydata/nginx/html
## 启动一个不挂载的容器
docker run -d --name nzc-nginx -p 80:80 nginx
## 进入容器
docker run -it nginx /bin/bash
## 退出
Ctrl+P+Q
## 从容器中把配置文件复制出来
docker cp nzc-nginx:/etc/nginx/nginx.conf /mydata/nginx/nginx.conf
docker cp nzc-nginx:/etc/nginx/conf.d /mydata/nginx/
docker cp nzc-nginx:/usr/share/nginx/html /mydata/nginx/ #此处就是网站站点目录
## 暂停、删除容器
docker stop nzc-nginx
docker rm -f nzc-nginx #直接删除正在运行的容器
## 重新启动一个挂载目录的容器 , 443 用于https 配置
docker run \
-p 80:80 -p 443:443 \
--name nginx \
-v /mydata/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /mydata/nginx/conf.d:/etc/nginx/conf.d \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/html:/us
nginx配置 default.conf(项目配置)
server {
listen 80;
# https 指定端口443
listen 443 ssl;
server_name petrichor.ren;
#access_log /var/log/nginx/host.access.log main;
# 强制https
# ssl on;
# ---------https 配置-------------------
ssl_certificate /usr/share/nginx/html/ssl/7285974_www.petrichor.ren.pem;
ssl_certificate_key /usr/share/nginx/html/ssl/7285974_www.petrichor.ren.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
#---------- end https ----------
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
# 后端反向代理
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://47.99.193.119:9001/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}