Doker初体验
该文章是在观看B站“三更草堂”up主的《Docker实战教程-从零到实战-Docker容器化-DockerFile&DockerCompose-挑战尚硅谷&黑马》视频教学时写的笔记
Docker
Doker初体验
准备工作
服务器
Doker安装
删除原有docker
yum remove docker
设置yum仓库链接
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
使用yum安装docker
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
开机自启动Docker
systemctl enable docker
启动Doker
systemctl start docker
#查看版本
docker -v

在/etc/docker/daemon.json文件配置加速器
vim /etc/docker/daemon.json
{"registry-mirrors": [
"https://docker.1panel.dev",
"https://docker.fxxk.dedyn.io",
"https://docker.xn--6oq72ry9d5zx.cn",
"https://docker.m.daocloud.io",
"https://a.ussh.net",
"https://docker.zhai.cm"]}
配置成功后
# 重新加载配置文件
sudo systemctl daemon-reload
# 重新启动docker服务
sudo service docker restart
#查看docker状态
systemctl status docker.service

测试
docker run hello-world
运行gitlab容器
运行gitlab容器
docker run -d -p 80:80 --hostname qitlab.example.com twang2218/gitlab-ce-zh:11.1

测试
浏览器访问主机如http://http://192.167.78.135/

设置账户密码



创建一个项目


将项目克隆到本地git
复制路径————由于没有域名所以用IP地址代替
新建一个文件做git克隆的仓库
再文件右键点击git Bash Here


Doker命令
帮助文档
docker --help
#详细命令帮助文档
docker pull(命令) --help

镜像和容器
docker操作常规流程
搜索镜像
docker search 镜像名
#比如
docker search mysql

Docker-Hub

访问网页搜索镜像

需要vpn国内无法访问
里面也有教你一些docker上使用MySQL的方法
下载镜像
docker pull

#比如
docker pull mysql:latest

列出镜像信息
docker images [选项](选项可加可不加)



列出容器信息
docker ps [选项]

docker ps -f (对什么进行过滤再显示)
#比如对容器状态进行过滤
docker ps -f status=exited(退出状态)

容器继续运行的条件

创建并运行容器
docker run [options] IMAGE [COMMAND] [ARG…]
如果只写镜像名则默认使用latest这个镜像
OPTIONS:选项,需要重点关注-d,-p,-v,-e,–restart这几个选项
IMAGE: 镜像信息,推荐使用 镜像名:TAG的写法 如果只写 镜像名 则相当于 tag是latest
COMMAND:创建容器后要执行的命令
ARG…:COMMAND命令的参数

运行方式
(1)默认运行方式
docker run nginx:latest
(2)后台运行
docker run -d nginx:latest
(3)交互式运行
docker run -it nginx:latest bash
可以进入到nginx容器进行查看

-i 以交互模式运行容器,通常与 -t 同时使用
-t 启动容器后,为容器分配一个命令行,通常与 -i 同时使
主要在学习阶段和调试的时候会使用到,并且一般容器的执行命令会使用bash,这样才能在
进入容器后去执行命令
退出交互式 使用exit
删除容器
docker rm [选项] [容器ID或容器名…]
docker rm 容器1
docker rm 容器1 容器2
#比如删除hello-world的容器
docker rm 2d1ec2bba545

尝试删除一个运行的nginx容器
docker rm -f fa8075110f21
尝试删除所有容器
()命令替换在 linux系统中,()是常用的一种命令替换语法,它可以将()中命令的输出结果作为字
符串使用。例如 ls $(pwd)
docker rm -f $(docker ps -aq )
尝试删除所有非运行状态的容器
docker ps -f status=exited -q #查询退出状态的容器
docker rm $(docker ps -f status=exited -q) #删除退出状态的容器
进入容器执行命令
docker exec [选项] 容器ID或容器名 命令 [参数…]
#比如
docker exec 容器id ls
后台运行一个nginx镜像的容器,然后尝试以交互式的方式进入该容器内部执行 curl 指令测试nginx是否启动成功
docker exec -it 容器id bash
#退出 exit
查看容器日志
docker logs [选项] 容器ID或容器名
(1)查看nginx容器的日志,要求需要持续显示新的日志
docker logs -f 容器id

(2)查看nginx容器的最近20条日志
docker logs -n 20 容器id
容器文件拷贝
我们可以使用 docker cp 命令来实现容器和宿主机之间 文件和目录的相互拷贝
#把容器中的文件拷贝到宿主机中
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
#把宿主机的文件拷贝到容器中
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
#比如
#拷贝任意一个文件到nginx容器中 (CONTAINER 为容器id)
docker cp /home/cp_test CONTAINER:/home/cp_test
#把nginx容器中的任意一个文件拷贝到宿主机中
docker cp CONTAINER:/usr/share/nginx/html/index.html /home/index.html

停止容器
docker stop [选项] [容器ID或容器名...]#可以多个容器
#停止一个后台运行的nginx容器
docker stop 容器id
运行容器
docker start [选项] [容器ID或容器名]
#运行一个被停止的nginx容器
docker start 容器id
run命令详解
run命令是最重要的命令,我们要学会其常用选项才能看懂真正生产中有的命令。
docker run --name my-custom-nginx-container -v
/host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e
MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run -d \
--hostname gitlab.example.com \
-p 80:80 \
-p 443:443 \
-p 22:22 \
--name gitlab \
--restart unless-stopped \
-v gitlab-config:/etc/gitlab \
-v gitlab-logs:/var/log/gitlab \
-v gitlab-data:/var/opt/gitlab \
twang2218/gitlab-ce-zh:11.1.4
常用选项
-p 端口对外发布(端口映射)
为什么要用 我们需要让外部能直接访问容器内的端口。
概念理解 端口发布到宿主机端口,就可以通过宿主机的端口访问容器内的端口了。
(用户要访问容器就要通过虚拟机的端口找到容器的端口进行访问,那么我们就要发布端口)

#发布一个端口
用法 docker run -p 宿主机端口:容器端口 镜像名
#发布多个端口
docker run -p [主机端口1]:[容器端口1] -p [宿主机端口2]:[容器端口2] 镜像名
经验 怎么知道需要发布容器的哪些端口呢?
可以看DockerHub的介绍
也可以从构建镜像的DockerFile中的EXPOSE
练习
后台运行nginx容器,让我们能通过宿主机的端口去测试容器中的nginx。
docker run -d -p 80:80 nginx
**需要注意的问题

-v 数据卷
为什么要用 需要把容器中的数据持久化保存 需要宿主机和容器间的数据共享 概念理解 将宿主机目录或
文件挂载到容器中,实现宿主机和容器之间的数据共享和持久化。

用法
docker run -v 宿主机目录:容器目录[:读写权限] 镜像名
读写权限 在使用 -v 选项时,可以添加 :ro 或 :rw 来指定容器对挂载的目录或文
件是只读(read-only)还是可读写(read-write)。如果不指定默认是rw。
思考 容器中哪些位置需要
挂载数据卷?从 DockerHub的介绍看 也可以从构建镜像的DockerFile VOLUME /var/lib/mysql
#比如
docker run -d -p 81:80 -v /home/index.html:/usr/share/nginx/html/index.html nginx
修改本机文件,容器会同步
-e 设置环境变量
为什么要用 容器中某些变量不能直接写死,需要让使用者在创建容器的时候指定,这种情况镜像中一般
是定义环境变量来使用。 例如mysql容器的root密码。 遇到这种镜像创建的容器我就可以使用-e来设置
环境变量的值。
用法
docker run -e 变量名=变量值 镜像名
思考
我们怎么知道需要设置什么环境变量,这个环境变量的意义是什么? DockerHub的介绍 构建镜像
的DockerFile
例子
需求 后台运行一个mysql5.7的容器 要求容器中的mysql可以被外部连接 mysql容器的数据需要持久化存
储,不能因为容器被删除而丢失。 mysql的root用户的密码设置为 sangeng
docker run -d -p 3306:3306 -v /home/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=2002 mysql:5.7

再去主机之外连接虚拟机MySQL

–name 容器命名
为什么要用 需要帮助我们更快的识别出来容器的作用。 概念理解 给容器命名
用法
docker run --name需要定义的容器名 镜像名
#比如
docker run -d --name nginx-test -p 82:80 -v /home/index.html:/usr/share/nginx/html/index.html nginx
–restart 容器退出后的重启策略
练习 需求 后台运行nginx容器 发布一个最简单的静态页面到Nginx,让我们能够通过浏览器去访问这个
静态页面 容器命名为 nginx-test 命令
docker run --restart always -d --name naginx-test2 -p 83:80 -v /home/index.html:/usr/share/nginx/html/index.html nginx

其他镜像和容器命令
镜像 查看镜像详细信息
用法
# docker image inspect [OPTIONS] IMAGE [IMAGE...]
docker image inspect 镜像id 容器
查看容器内进程
用法
docker top CONTAINER [ps OPTIONS]
#举例
docker top nginx_test
查看容器详细信息
用法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
举例
docker inspect nginx_test

网络联通
创建网络
docker network create [网络名]

创建容器时加入网络:
docker run --network 网络名 镜像名
容器创建后加入 :
docker network connect [选项] 网络名 容器名或id
查看网络详细信息:
docker network inspect 网络名
哪些容器在网络中

删除网络:
docker network rm 网络名或id
剔除网络中的容器
docker network disconnect 网络名或id 容器名或id
数据卷
为什么要用
需要把容器中的数据持久化保存 需要宿主机和容器间的数据共享
作用
实现宿主机和容器之间文件或者文件夹的同步。一般用来解决容器数据的持久化或者是宿主机和容器间
的数据共享。
数据卷相关操作
设置数据卷
绝对路径 docker run -v 宿主机目录:容器目录[:读写权限] 镜像名 别名
我们可以直接使用数据卷的别名 来作为宿主机的目录来使用。
如果这个别名的数据卷还不存在的话,Docker会自动帮我们创建对应的数
据卷。
docker run -v 数据卷别名:容器目录[:读写权限] 镜像名
例子
docker run -d -p 80:80 -v nginx_html:/ust/share/nginx/html nginx
查看数据卷的信息
docker inspect 容器id

数据卷中会有同步的文件

列出所有数据卷
用法 docker volume ls
查看数据卷详情
用法
docker volume inspect 数据卷名
创建数据卷
用法
docker volume create 数据卷名
思考
我们在创建数据卷的时候只指定了个别名,那我们怎么知道这个数据卷在我们宿主机的什么位置呢?
使用docker volume inspect
删除数据卷
用法
docker volume rm 数据卷名
思考 如果要删除一个正在被使用的数据卷能直接删除嘛?如果需要删
除一个正在被使用的数据卷应该怎么办呢? 删除容器后再去删除数据卷

实践项目部署案例
基础版
环境准备
MySQL
需求

#创建容器
docker run -d -v mysql_data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=2002 --restart always --name blog_mysql mysql:5.7
初始化数据导入所需MySQL数据库
redis

redis开启aof持久化命令:redis-server --appendonly yes
#下载redis镜像
docker run -d -v redis_data:/data -p 6379:6379 --restart always --name blog_redis redis:7.0 redis-server --appendonly yes
*测试
进入redis容器
docker exec -it 824205514bf7 bash
开启redis
redis-cli
应用部署
后端应用
部署jdk环境

先将项目jar包放入数据卷/usr/blog中
docker run -p 7777:7777 -d -v /usr/blog:/usr/blog --restart always --name blog_mysql java:openjdk-8u111 java -jar /usr/blog/sangeng-blog-1.0-SNAPSHOT.jar
测试
curl --location --request POST 'http://localhost:7777/login' --header 'Content-Type: application/json' --data '{"userName":"sg","password":"1234"}'
网络连通
创建网络
docker network create blog_net
也可以在创建容器时创建网络
docker run -p 7777:7777 -d --network blog_net -v /usr/blog:/usr/blog --restart always --name sg_blog
java:openjdk-8u111 java -jar /usr/blog/sangeng-blog-1.0-SNAPSHOT.jar "--spring.datasource.url=jdbc:mysql://blog_mysql:3306/sg_blog?characterEncoding=utf-8&serverTimezone=Asia/Shanghai" "--spring.datasource.username=root" "--spring.datasource.password=2002" "--spring.redis.host=blog_redis"
把容器加入对应的网络
docker network connect blog_net blog_mysql
docker network connect blog_net blog_redis
前端应用
修改宿主机以及端口

然后上传前端项目文件到数据卷
要求
使用nginx 1.21.5版本部署sg-blog-vue让用户能正常的访问

命令
docker run \
-p 80:80 \
-v /usr/blog/sg-blog-vue/dist:/usr/share/nginx/html\
--restart always \
-d \
--name sg_blog_vue \
nginx:1.21.5
后端应用部署优化
自定义镜像
希望后端的镜像当中就包含了后端的jar包,镜像启动的时候默认就是会启动该jar包。
DockerFile
在路径/usr/blog/中创建指令文件 sg_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-SNAPSHOTjar",--spring.datasource.url=jdbc:mysql://blog_mysql:3306/sg_blog?characterEncoding=utf8&serverTimezone=Asia/Shan
ghai",
"--spring.datasource.username=root",
"--spring.datasource.password=2002",
"--spring.redis.host=blog_redis" ]
构建镜像
docker build -t sg_blog:01 -f sg_blog_dockerfile .
删除之前的容器sg_blog
docker rm -f sg_blog
创建容器sg_blog以镜像sg_blog:01为基础
docker run -p 7777:7777 -d --network blog_net --restart always --name sg_blog sg_blog:01
进入容器中ping其他容器
docker exec -it sg_blog bash

前端应用部署优化
自定义镜像
FROM nginx:1.21.5
WORKDIR /app
COPY sg-blog-vue .
RUN cp -r dist/* /usr/share/nginx/html
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]
构建镜像
docker build -t sg_blog_vue:01 -f sg_blog_vue_dockerfile .
先删除之前容器并创建容器并运行
docker run -p 80:80 --restart always -d --name sg_blog_vue sg_blog_vue:01
希望前端的镜像中就包含了前端的包
网桥
DokerFile

编写镜像
docker build -t hello:1.0 -f Helloword .

运行测试
docker run hello:1.0
FROM

用法:
FROM 镜像名:标签名

CMD

作用:用来定义容器运行时的默认命令。可以在使用dockerrun的时候覆盖掉CMD中定义的命令
用法:
CMD[“命令1","参数1",“参数2”]
ARG
这是 Dockerfile 中的一个指令,用于定义一个变量,该变量可以在构建过程中被设置或覆盖,也可以在运行时传递给容器
ENV

ENV 变量名=“变量值”
#例如
ENV DIR="/root"
需求:基于HelloWord的案例进行改造,要求打印的内容可以任意指定,具体内容在运行容器的时候通过修改环境变量的方式去指定
脚本:


WORKDIR

用法: WORKDIR 目录
问题

RUN
作用:它是用来定义构建过程中要执行的命令的
用法
RUN 命令
#例如
RUN echo sg
作用时机 :构建镜像的时候
示例:

ADD

vim Test03

创建镜像
docker build -t test03:1 -f Test03
#运行镜像
docekr run -d test03:1
#进入容器
docker exec -it 9eec2169a4f9 bash
#访问

EXPOSE
EXPOSE 端口号1 端口号 2...

#创建镜像
docker build -t test03:2 -f Test03
#创建并运行容器
docker run -d -p 81:80 test03:2
#再访问

COPY

用法:
COPY 原路径 目标路径

ENTRYPOINT

与CMD结合,把不希望被覆盖的命令用ENTRYPOINNT定义,其他部分用CMD定义,这样启动容器的时候只会覆盖CMD的部分

镜像推送DockerHub
登录
docker login
构建镜像
docker build -t username/镜像名:tag .

给镜像打标签,以便将其与 Docker Hub 上的仓库关联
docker tag username/镜像名:tag username/镜像名:tag

镜像推送
docker push username/镜像名:tag

DokerCompose
我们在部署运行一个项目的时候可能需要运行多个容器,还要去处理这些容器的网络,数据卷等。如果用docker命令一个
个去处理还是不方便。
DockerCompose就是去解决这个问题的。
DockerCompose是用来定义和运行一个或多个容器(通常都是多个)运行和应用的工具。
可以使用 YAML文件来配置应用程序的服务。然后,使用单个命您可以根据配置创建并启动所有服务。
使用docker compose version
可以查看版本

运行
docker compose up
停止
docker compose down
在文件/usr下创建一个copmose_test文件夹并创建docker-compose.yaml文件
在其中写入

然后运行
可以查看容器看是否运行成功
元素
command:覆盖容器启动后的默认指令
environment:指定环境变量,相当于run的-e选项
image:用来指定镜像
networks:指定网络,相当于run的--network
ports:用来指定要发布的端口,相当于run的-p
volumes:用来指定数据卷,相当于-v
restart:用来指定重启策略,相当于--restart
项目部署案例
删除之前的容器:防止之前端口被占用报错
#比如
docker rm -f sg_blog_vue sg_blog blog_redis blog_mysql naginx-test2
在/usr/copmose_test文件下创建 docker_compose.yaml文件
#mysql
blog_mysql:
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 2002
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
#后端服务
sg_blog:
image: sg_blog:01
ports:
- 7777:7777
networks:
- blog_net
restart: always
#前端服务
sg_blog_vue:
image: sg_blog_vue:01
ports:
- 80:80
restart: always
#定义网络要同级
networks:
blog_net:
#数据卷定义
volumes:
mysql_data:
#表示使用之前已经创建的数据卷
external: true
redis_data:
external: true
从下面图片可以看出dockercompose会在命名前加前缀所以这是一个新的,同理数据卷命名也会有前缀,如果之前有数据卷我们可以在数据卷下加入external: true;如果不加需要重新导入数据


运行然后测试
docker compose up -d
restart:用来指定重启策略,相当于–restart
## 项目部署案例
删除之前的容器:防止之前端口被占用报错
#比如
docker rm -f sg_blog_vue sg_blog blog_redis blog_mysql naginx-test2
在/usr/copmose_test文件下创建 docker_compose.yaml文件
#mysql
blog_mysql:
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 2002
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
#后端服务
sg_blog:
image: sg_blog:01
ports:
- 7777:7777
networks:
- blog_net
restart: always
#前端服务
sg_blog_vue:
image: sg_blog_vue:01
ports:
- 80:80
restart: always
#定义网络要同级
networks:
blog_net:
#数据卷定义
volumes:
mysql_data:
#表示使用之前已经创建的数据卷
external: true
redis_data:
external: true
从下面图片可以看出dockercompose会在命名前加前缀所以这是一个新的,同理数据卷命名也会有前缀,如果之前有数据卷我们可以在数据卷下加入external: true;如果不加需要重新导入数据
[外链图片转存中...(img-hbiQkxTS-1734533383131)]
[外链图片转存中...(img-hDkGQCFl-1734533383131)]
运行然后测试
docker compose up -d
## 可视化工具z
更多推荐




所有评论(0)