docker 基础
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




岁月如歌,,,

浙公网安备 33010602011771号