Docker
1 安装
卸载原有的docker
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
设置仓库链接
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动Dcoker
sudo systemctl enable docker
sudo systemctl start docker
测试
sudo docker run hello-world
2 镜像加速
# 1
sudo mkdir -p /etc/docker
# 2
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ballbe5k.mirror.aliyuncs.com"]
}
EOF
# 3
sudo systemctl daemon-reload
# 4
sudo systemctl restart docker
3 Docker命令
3.1 帮助文档
# 查看所有指令
docker --help
# 查看具体某个指令,例如ps
docker ps --help
3.2 镜像和容器
3.2.1 搜索镜像
Docker-Hub搜索镜像
3.2.2 下载镜像
[ ] :代表可写可不写,如果不写,默认是从docker-hub上拉取
3.2.3 列出镜像信息
# 列出所有镜像的的镜像id
docker images -a -q 或者 docker images -aq
# 列出所有镜像名为mysql的镜像id
docker images -aq --filter=reference=mysql
3.2.4 列出容器信息
3.2.5 创建并运行容器
如果没有输入COMMAND则会默认运行的命令
默认运行方式
后台运行
3.2.6 删除容器
3.2.7 进入容器执行命令
docker exec -it a0937 bash
curl http://127.0.0.1
3.2.8 查看容器日志
持续显示新的日志
docker logs -n 20 a093
3.2.9 容器文件拷贝
宿主机拷贝到容器中
docker cp /home/cp_test a093:/home/cp_test
容器拷贝到宿主机中
docker cp a093:/usr/share/nginx/html/index.html /home/index.html
3.2.10 停止/运行容器
docker stop xxx
docker start xxx
3.3 run命令
3.3.1 重点学习
run命令是最重要的命令,我们要学会其常用选项才能看懂真正生产中有的命令。
3.3.2 常用选项
-p 端口映射
-p 端口对外发布(端口映射)
我们如何知道需要发布容器的哪些端口
方式一
方式二
-v 数据卷
容器中哪些位置需要挂载数据卷
方式一
方式二
nginx的dockerfile中不知道为什么没有volume
结构图
docker run -d -p 81:80 -v /home/index.html:/usr/share/nginx/html/index.html nginx
-e 设置环境变量
如何知道需要设置什么环境变量
docker run -d -p 3307:3306 -v /home/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=fp mysql:5.7
如果在mysql中,新建一个test数据库,然后删除mysql 容器。重新再次运行刚才命令,重新连接mysql,发现test数据库依然存在,因为-v数据卷进行了持久化操作
--name 容器命名
docker run -d --name nginx-test -p 82:80 -v /home/index.html:/usr/share/nginx/html/index.html nginx
--restart 重启策略
docker update --restart=always nginx-test
docker run --restart always -d --name nginx-test -p 82:80 -v /home/index.html:/usr/share/nginx/html/index.html nginx
3.4 其他镜像和容器命令
3.4.1 镜像详细信息
docker images
docker image inspect 605c
docker top 40ba
docker inspect 40ba
3.5 数据卷
3.5.1 作用
3.5.2 相关操作
设置数据卷
docker run -d -p 80:80 -v nginx_html:/usr/share/nginx/html nginx
列出、查看、创建、删除
4 项目部署案例
4.1 项目介绍
4.2 部署
4.2.1 mysql
docker run -d -v mysql_data:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=fp --restart always --name blog_mysql mysql:5.7
连接成功
4.2.2 redis
docker run -d -v redis_data:/data -p 6379:6379 --restart always --name blog_redis redis:7.0 redis-server --appendonly yes
4.2.3 后端应用
这个地方有些问题,需要学习网络后,在解决
学习网络后
4.2.4 前端应用
5 网络(网桥)
5.1 使用原因
apt-get update
apt install iputils-ping
5.2 相关操作
docker network create blog_net
docker network ls
docker network connect blog_net blog_mysql
docker network inspect blog_net
docker network rm nettest
6 DockerFile
6.1 概述
为什么要学习
镜像分层
6.2 基本语法
6.3 快速入门
FROM centos:7
CMD ["echo","helloworld"]
docker build -t hello:1.0 -f HelloWorld . # .代表当前目录下
6.4 指令学习
6.4.1 常用指令
FROM
CMD
ENV
FROM centos:7
ENV CONTENT="helloworld"
CMD echo $CONTENT
docker run -e CONTENT="JAVA" test01:2
WORKDIR
测试
RUN
FROM centos:7
ENV CONTENT="hellodcoker"
WORKDIR /app/fp
RUN echo $CONTENT > content.txt #容器构建的时候,执行的命令
CMD ["cat","content.txt"]
ADD
Test03
FROM nginx:1.21.5
WORKDIR /app
ADD sg-blog-vue.tar.gz . # 最后的 . 代表放到当前的目录下
# RUN tar -zxvf sg-blog-vue.tar.gz ADD会将压缩包自动解压
RUN cp -r sg-blog-vue/dist/* /usr/share/nginx/html
CMD ["nginx","-g","daemon off;"] #nginx在前台开启一个进程,可以访问
FROM nginx:1.21.5
WORKDIR /app
ADD https://sg-blog-oss.oss-cn-beijing.aliyuncs.com/exampledir/sg-blog-vue.tar.gz . # 最后的 . 代表放到当前的目录下
RUN tar -zxvf sg-blog-vue.tar.gz # 网络上的压缩包,ADD不会将压缩包自动解压
RUN cp -r sg-blog-vue/dist/* /usr/share/nginx/html
CMD ["nginx","-g","daemon off;"] #nginx在前台开启一个进程,可以访问
EXPOSE
FROM nginx:1.21.5
WORKDIR /app
ADD https://sg-blog-oss.oss-cn-beijing.aliyuncs.com/exampledir/sg-blog-vue.tar.gz . # 最后的 . 代表放到当前的目录下
RUN tar -zxvf sg-blog-vue.tar.gz # 网络上的压缩包,ADD不会将压缩包自动解压
RUN cp -r sg-blog-vue/dist/* /usr/share/nginx/html
EXPOSE 80
CMD ["nginx","-g","daemon off;"] #nginx在前台开启一个进程,可以访问
COPY
ENTRYPOINT
7 项目部署
7.1 后端部署
fp_blog_dockerfile
FROM java:openjdk-8u111
#指定工作目录
WORKDIR /app
#添加jar包到镜像中
ADD sangeng-blog-1.0-SNAPSHOT.jar .
#声明开放端口
EXPOSE 7777
#指定容器运行命令
CMD ["java","-jar","sangeng-blog-1.0-SNAPSHOT.jar","--spring.datasource.url=jdbc:mysql://blog_mysql:3306/sg_blog?
useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai","--spring.datasource.username=root","--spring.datasource.password=fp","--spring.redis.host=blog_redis"]
构建容器
docker build -t fp_blog:01 -f fp_blog_dockerfile .
docker run -d -p 7777:7777 --network blog_net --restart always --name fp_blog fp_blog:01
curl --location --request POST 'http://localhost:7777/login' --header 'Content-Type:application/json' --data '{"userName":"sg","password":"1234"}'
7.2 前端部署
FROM nginx:1.21.5
WORKDIR /app
COPY sg-blog-vue . #复制的sg-blog-vue文件夹,所以只会有一个dist目录
RUN cp -r dist/* /usr/share/nginx/html
EXPOSE 80
CMD ["nginx","-g","daemon off;"] #nginx在前台开启一个进程,可以访问
docker build -t fp_blog_vue:01 -f fp_blog_vue_dockerfile .
docker run -d -p 80:80 --restart always --name fp_blog_vue fp_blog_vue:01
重新构建容器运行
访问
8 推送镜像到镜像仓库
docker build -t fengpengfpfp/fp_blog:01 -f fp_blog_dockerfile .
docker tag fengpengfpfp/fp_blog:01 fengpengfpfp/fp_blog:01
docker push fengpengfpfp/fp_blog:01
9 DockerCompose
9.1 概述
9.2 快速入门
services:
test: #代表服务
image: nginx #代表镜像
docker compose up -d
docker compose down
9.3 元素
9.4 案例
docker-compose.yaml
services:
#mysql
blog_mysql:
image: mysql:5.7
#数据卷
volumes:
- mysql_data:/var/lib/mysql
ports:
- 3307:3306
environment:
MYSQL_ROOT_PASSWORD: root
restart: always
networks:
- blog_net
#redis
blog_redis:
image: redis:7.0
volumes:
- redis_data:/data
ports:
- 6379:6379
restart: always
command: ['redis-server','--appendonly','yes']
networks:
- blog_net
#后端服务
fp_blog:
image: fp_blog:01
ports:
- 7777:7777
networks:
- blog_net
restart: always
#前端服务
fp_blog_vue:
image: fp_blog_vue:01
ports:
- 80:80
restart: always
#指定上方使用的网络
networks:
blog_net:
#指定上方使用的数据卷
volumes:
mysql_data:
redis_data:
因为数据卷不是我们之前定义的数据卷,所以数据卷对应的数据库中就没有之前的数据,因此查询失败
services:
#mysql
blog_mysql:
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
ports:
- 3307:3306
environment:
MYSQL_ROOT_PASSWORD: root
restart: always
networks:
- blog_net
#redis
blog_redis:
image: redis:7.0
volumes:
- redis_data:/data
ports:
- 6379:6379
restart: always
command: ['redis-server','--appendonly','yes']
networks:
- blog_net
#后端服务
fp_blog:
image: fp_blog:01
ports:
- 7777:7777
networks:
- blog_net
restart: always
#前端服务
fp_blog_vue:
image: fp_blog_vue:01
ports:
- 80:80
restart: always
networks:
blog_net:
volumes:
mysql_data:
external: true
redis_data:
external: true