欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > Docker基本使用(持续更新中)

Docker基本使用(持续更新中)

2024/10/24 1:55:36 来源:https://blog.csdn.net/m0_75165868/article/details/142268483  浏览:    关键词:Docker基本使用(持续更新中)

1 常用命令

1.1保存镜像到本地

命令如下:

docker save -o nginx.tar nginx:latest

举例

结果:在当前目录下多了一个nginx.tar的包

1.2加载本地镜像 

命令如下:

docker load -i nginx.tar 

举例:

查看当前镜像是没有nginx的

加载本地镜像

结果:查看镜像就会发现多了一个nginx

1.3 查看某个镜像日志 

命令如下:

docker logs -f 容器名

注意:加上-f是实时查看日志输出,不加的话是输出当前时刻前的日志。 

1.4 进入容器内部

命令如下:

docker exec -it 容器名  bash

举例:

1.5 Linux命令设置别名 

步骤一:打开别名文件,准备编辑

vi ~/.bashrc

步骤二:添加命名的别名 

步骤三:让别名生效

source ~/.bashrc 

步骤四:测试

 1.6 数据卷

1.6.1数据卷介绍与常见命令

数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁。

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源

  • conf:放置配置文件

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

在上图中:

  • 我们创建了两个数据卷:confhtml

  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联。

  • 而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录

这样以来,容器内的confhtml目录就 与宿主机的confhtml目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。 

1.6.2 查看容器的挂在情况

命名:

docker inspect 容器名

1.6.3挂载本地目录或文件 

可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

注意:本地目录或文件必须以 /./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

举例:

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

2 自定义镜像

2.1 dockerfile

 举例:

 

举例

步骤一:创建Dockerfile

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

步骤二:将项目拷贝到与Dockerfile同一目录下(当然也并不是必须这样做)

步骤三:构建镜像

docker build -t demo:1.0 .

注意:后面的.不要忘记加了,这个点代码Dockerfile所在位置。

步骤四:运行镜像

docker run -d -p 8080:8080 --name demo demo:1.0

 3 容器网路互联

所有说docker内的容器是可以通过网桥相互访问的。但是容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。所以,我们必须借助于docker的网络功能来解决这个问题,

 

使用步骤:

步骤一:创建网络 

docker network create heima

步骤二:可以在创建容器的时候将容器直接加入网络

docker run -d -p 8080:8080 --name demo --network heima  demo:1.0

查看容器网络详情:

docker inspect demo

4 DockerCompose

大家可以看到,我们部署一个简单的java项目,其中包含3个容器:

  • MySQL

  • Nginx

  • Java项目

而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。

如果用docker-compose.yml文件来定义,就是这样:

version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com