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

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐