Docker部署到实战
文章目录
- Docker部署到实战
- Docker 命令
- 镜像
- 容器
- 保存镜像
- Docker 存储
- 目录挂载
- 卷映射
- Docker Compose
- 创建wordpress容器
- Dockerfile
- 参考地址
Docker部署到实战
docker拉取国内特别慢(甚至超时), 修改 Docker Engine 的配置文件(完成后,进行系统重启) .
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docker.m.daocloud.io"]}
Docker架构与容器化
- 安装了Docker、运行Docker服务的机器–Docker Host, 负责执行各种docker命令
- 通过Docker-cli 向Docker Host 发送命令
- Registry 仓库–应用市场
```
docker pull redis # 拉取远程仓库镜像到本地
docker push xxx # 推送本地镜像到远程仓库docker run redis # 运行镜像,创建容器(不存在的话,进行自动远程拉取)
docker build xxx # 构建镜像并保存到本地```
容器和镜像的关系镜像可以理解为软件. 容器可以理解为基于镜像的一个实例.
为什么需要容器?
传统部署: 可以理解整个服务器是一个容器, 各种应用共享服务器各种软硬件资源. 出现应用资源使用过多, 拖慢整个服务器上的应用.
虚拟化部署: 可以理解为操作系统上创建多个虚拟机,给每个虚拟机分配CPU\内存\硬盘等资源, 虚拟机内部安装操作系统, 每一个虚拟机内部的应用共享软硬件资源. 同样会出现某个应用过多时, 拖慢整个虚拟机.此外虚拟机和其上的操作系统都比较耗费资源.
容器化部署: 将虚拟化部署中的虚拟机粒度,进一步压缩为容器. 每个容器有自己的CPU\内存\硬盘等资源, 容器之间相互隔离,又可以通过网络相互通信.
Docker 命令
镜像
```
#docker search nginx # 搜索镜像
#docker pull nginx # 拉取镜像到本地
#docker pull nginx:lastest # 拉取最新指定版本镜像
#docker pull nginx:1.26.0 # 拉取特定版本镜像
#docker images ls # 列出本地镜像
#docker images # 列出本地镜像
#docker rmi nginx:1.26.0 # 删除本地镜像
#docker rmi nginx:138383343799222 # 删除本地镜像 138383343799222(Image ID)```
容器
# docker run --help # 帮助文档# docker run nginx # 运行镜像(不存在则自动拉取, 没有写版本默认为latest)# docker run nginx:1.26.0 # 运行镜像 # docker run -d # -d 后台运行--name mynginx # --name 容器名称-p 80:80 # -p 宿主机端口:容器端口 映射(如果容器对外直接提供服务,必须将端口映射到宿主机,然后访问宿主机的端口即可)nginx:1.26.0 #docker ps # 列出正在运行的容器#docker ps -a # 列出所有容器(包括停止的)#docker start 578 # 启动容器(578为容器ID前几位和其他容器区分即可)#docker stop 578 # 停止容器(578为容器ID前几位和其他容器区分即可)#docker restart 578#docker stats 578 # 查看容器的实时状态CPU/内存使用情况# docker logs 578 # 查看容器的日志# docker rm 578 # 删除容器(必须先停止)#docker rm -f 578 # 强制删除容器# docker exec -it mynginx /bin/bash # -it 交互方式 /bin/bash 进入控制台# cd /usr/share/nginx/html #hub.docker.com镜像说明,会有说明修改文件的位置# echo "1111">index.html
保存镜像
```
# docker commit --help # 帮助
# docker commit -m "update index" # 修改内容
457 mynginx:v1 # 457原来的容器id, mynginx:v1 新的镜像名称
# docker save --help
# docker save -o mynginx.tar mynginx:v1 # 将镜像保存为本地文件
# docker load --help
# docker load -i mynginx.tar # 加载镜像
# docker run -d --name app00 -p 81:80 mynginx:v1.0 # 使用镜像,创建一个容器. ```
Docker 存储
不进行存储设置时, 对容器的修改步骤:
```
# docker run -d -p 80:80 --name app01 nginx # 创建一个容器
# docker exec -it app01 bash # 进入容器
# cd /usr/share/nginx/html # 进入html目录
# echo "hello world" > index.html
# exit
```
上述操作完成了对容器的修改. 由于种种原因,容器损坏,不能打开. 或者发生了人为的误删除. 修改的内容将全部丢失. 此时,就 可以使用目录挂载或卷映射来解决.
目录挂载
```
# docker run -d -p 81:80 -v ./html:/usr/share/nginx/html --name app02 nginx# 此时访问 http://192.168.0.102:81, 发现403错误. 首次创建容器时, 会将./html目录的文件夹内容覆盖容器中的/usr/share/nginx/html目录.# 修改./html/index.html, 访问浏览器都会进行更新. # 容器内的修改,同样会同步到./html目录下.# docker exec -it app02 bash# cd /usr/share/nginx/html
# echo "hello world" > index.html
# ./html/index.html 内容发生更新.
```
注意: 首次创建,会发生目录覆盖.
卷映射
使用方式上与目录挂载非常相似. 唯一的区别是卷映射使用的是一个字符串(路径由docker自动管理),而不是本地一个确切的路径.
```
# docker run -d -p 100:80 -v nginx_conf:/etc/nginx --name app04 nginx
# 这个时候创建了一个名为nginx_conf的卷, 用于存储nginx的配置文件. 只要不手动删除卷, 配置文件会一直保留.
# 初始 容器 /etc/nginx 下内容会复制到卷中# docker volume ls # 查看所有卷
# docker volume rm volume_name # 删除卷(彻底删除存储的内容,要谨慎)
# docker volume inspect volume_name # 查看卷的详细信息(linux Mountpoint显示具体路径,windows除外)
```
## Docker 网络没有指定网络的情况下, 容器创建时,会加入默认网络. 默认网络不支持容器名和容器ip转换(类似于DNS). 为了简化容器互通, 可以使用docker network create 创建自定义网络. 所有要进行通信的容器, 都加入自定义网络.然后可以使用容器名直接进行宿主机内部访问. ```
# docker network ls # 查看所有网络# docker network create nginx_net # 创建自定义网络# docker run -d -p 88:80 --name app01 --network nginx_net nginx
# docker run -d -p 99:80 --name app02 --network nginx_net nginx# docker exec -it app01 bash
# curl http://app02:80
# exit```
Docker Compose
```
#docker compose up -d # 启动并上线应用 -d 后台运行
#docker compose down # 停止并删除容器(网络)#docker compose start x1 x2 x3 # 启动#docker compose stop x1 x3 # 停止
```### 创建mysql容器```#docker network create blog```创建网络注意: ^ 表示换行(windows 下使用), 其他平台为 \```
docker run -d -p 13306:3306 ^
-e MYSQL_ROOT_PASSWORD=123456 ^
-e MYSQL_DATABASE=wordpress ^
-v mysql-data:/var/lib/mysql ^
-v ./myconf:/etc/mysql/conf.d ^
--restart always --name mysql ^
--network blog ^
mysql:8.0
```
创建wordpress容器
```
docker run -d -p 9080:80 ^
-e WORDPRESS_DB_HOST=mysql ^
-e WORDPRESS_DB_USER=root ^
-e WORDPRESS_DB_PASSWORD=123456 ^
-e WORDPRESS_DB_NAME=wordpress ^
-v wordpress:/var/www/html ^
--restart always --name wordpress-app ^
--network blog ^
wordpress:latest
```
每次都执行这么长串的指令, 很麻烦。并且不容易保存. 创建docker-compose.yml文件
```
name: myblog # 项目名
services:
mysql:container_name: mysql # 容器名image: mysql:8.0 # 镜像ports:- "13306:3306" # 映射端口environment:- MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=wordpressvolumes:- mysql-data:/var/lib/mysql # 数据卷(必须在顶层进行声明)- ./myconf:/etc/mysql/conf.d # 目录挂载restart: alwaysnetworks:- blogwordpress:container_name: wordpress-app image: wordpress:latestrestart: alwaysports:- "9980:80"environment:- WORDPRESS_DB_HOST=mysql- WORDPRESS_DB_USER=root- WORDPRESS_DB_PASSWORD=123456- WORDPRESS_DB_NAME=wordpressvolumes:- wordpress:/var/www/htmlnetworks:- blogdepends_on:- mysqlvolumes: # 创建数据卷
mysql-data:
wordpress:networks: # 创建网络
blog:```
#docker compose up -d #将这个应用一键上线 -d含义是后台运行#docker compose down #将这个应用一键下线(删除所有容器包括网络), 不会删除数据卷#docker compose down -v #将这个应用一键下线(删除所有容器包括网络), 会删除数据卷. 目录挂载依然保留. #docker compose down --rmi all #删除所有容器, 删除所有镜像
docker-compose.yml 发生修改后, 运行 docker-compose up -d 仅仅重建受影响的容器, 不会重启其他容器.
使用compose 进行批量启停容器!
compose-file
Dockerfile
Dockerfile
```
FROM openjdk:17 # FROM 镜像LABEL author="Jonathan" # LABEL 标签COPY ./hellospringboot2-0.0.1-SNAPSHOT.jar /app.jar # COPY 拷贝文件
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"] # ENTRYPOINT 启动命令```
构建镜像
```
docker build -t myjavaapp:v1.0 . #. 表示当前目录 -t 镜像名称:标签
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjavaapp v1.0 bf517e3c1587 9 hours ago 489MB# docker run -d -p 9999:8080 myjavaapp:v1.0
8bd64f613f08c857300432ec9bf95b5b3895bd41e01bc0aeda0a034c22f5d8ca```
Dockerfile reference
参考地址
尚硅谷3小时速通Docker教程,名师带练docker部署到实战!