Docker入门

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

CentOS 7(使用 yum 进行安装)
  1. # step 1: 安装必要的一些系统工具
  2. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  3. # Step 2: 添加软件源信息
  4. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. # Step 3
  6. sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
  7. # Step 4: 更新并安装Docker-CE
  8. sudo yum makecache fast
  9. sudo yum -y install docker-ce
  10. # Step 5: 设置docker开机自启
  11. sudo systemctl enable docker
  12. # Step 6: 开启Docker服务
  13. sudo service docker start
  14. # 注意:
  15. # 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
  16. # vim /etc/yum.repos.d/docker-ce.repo
  17. #   将[docker-ce-test]下方的enabled=0修改为enabled=1
  18. #
  19. # 安装指定版本的Docker-CE:
  20. # Step 1: 查找Docker-CE的版本:
  21. # yum list docker-ce.x86_64 --showduplicates | sort -r
  22. #   Loading mirror speeds from cached hostfile
  23. #   Loaded plugins: branch, fastestmirror, langpacks
  24. #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
  25. #   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
  26. #   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
  27. #   Available Packages
  28. # Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
  29. # sudo yum -y install docker-ce-[VERSION]
复制代码
Docker 进程相关命令


  • 启动docker服务:
  1. systemctl start docker
复制代码

  • 停止docker服务:
  1. systemctl stop docker
复制代码

  • 重启docker服务:
  1. systemctl restart docker
复制代码

  • 查看docker服务状态:
  1. systemctl status docker
复制代码

  • 设置开机启动docker服务:
  1. systemctl enable docker
复制代码
Docker 镜像相关命令


  • 查看镜像: 查看本地所有的镜像
  1. docker images
  2. # 查看所用镜像的id
  3. docker images –q
复制代码

  • 搜索镜像:从网络中查找需要的镜像
  1. docker search 镜像名称
复制代码

  • 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。 如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。
  1. docker pull 镜像名称
复制代码

  • 删除镜像: 删除本地镜像
  1. # 删除指定本地镜像
  2. docker rmi 镜像id
  3. # 删除所有本地镜像
  4. docker rmi `docker images -q`
复制代码
Docker 容器相关命令


  • 查看容器
  1. # 查看正在运行的容器
  2. docker ps
  3. # 查看所有容器
  4. docker ps –a
复制代码

  • 创建并启动容器
  1. docker run 参数
复制代码

  • 参数说明:
  1.   -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
  2.   -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
  3.   -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。
  4.   -it: 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器
  5.   --name:为创建的容器命名。
  6.   -p: 端口主机端口与容器端口的映射关系,如配置-p 8888:80代表开放容器端口80并将主机端口8888映射到容器的80端口
  7.   -P:表示开放容器全部端口,并将主机的端口随机与容器端口做映射
  8.   --rm: 表示容器停止后自动删除容器
  9.   –restart:重启策略,always意外关闭之后就会自动重启(开机启动),on-failure可以设置重启次数(on-failure:3表示重启3次),默认no即不会重启
  10.   --net:配置网卡
复制代码

  • 进入容器
  1. # 退出容器,容器不会关闭
  2. docker exec 参数
  3. # 进入nginx并打开终端
  4. docker exec -it nginx /bin/bash
复制代码

  • 停止容器
  1. docker stop 容器名称
复制代码

  • 启动容器
  1. docker start 容器名称
复制代码

  • 删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除
  1. docker rm 容器名称
复制代码

  • 查看容器信息
  1. docker inspect 容器名称
复制代码
Docker 容器的数据卷

什么是数据卷


  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷
有什么用


  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换
配置数据卷


  • 创建启动容器时,使用 –v 参数 设置数据卷
  1. docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
复制代码

  • 注意事项:

  • 目录必须是绝对路径
  • 如果目录不存在,会自动创建
  • 可以挂载多个数据卷
以nginx为例
  1. docker run \
  2. -p 8888:80 \
  3. --name nginx \
  4. -v /Users/wandaren/develop/docker-nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
  5. -v /Users/wandaren/develop/docker-nginx/conf/conf.d:/etc/nginx/conf.d \
  6. -v /Users/wandaren/develop/docker-nginx/log:/var/log/nginx \
  7. -v /Users/wandaren/develop/docker-nginx/html:/usr/share/nginx/html \
  8. -d nginx
复制代码
  1. # 挂载nginx.conf配置文件
  2. -v /Users/wandaren/develop/docker-nginx/conf/nginx.conf:/etc/nginx/nginx.conf
  3. # 挂载nginx配置文件
  4. -v /Users/wandaren/develop/docker-nginx/conf/conf.d:/etc/nginx/conf.d
  5. #        挂载nginx日志文件
  6. -v /Users/wandaren/develop/docker-nginx/log:/var/log/nginx
  7. # 挂载nginx内容
  8. -v /Users/wandaren/develop/docker-nginx/html:/usr/share/nginx/html
  9. \        shell 命令换行
复制代码
网络Network

是什么


  • 是Docker对容器网络隔高的一项技术,提供了多种不同的模式供用户使用,选择不同的网络模式来实现容器网络的互通以及彻底的隔离。
为什么需要


  • 容器间的风络隔离
  • 实现部分容器之间的网络共享
  • 管理多个子网下容的ip
能干什么


  • 提供了多种模式,可以定制化的为每个容器指定不同的网络
  • 自定义网络模式,划分不同的子网以及网关、dns等配置
  • 网络互通

    • 实现不同子网之间的网络互通
    • 基于容器名(主机名)的方式在网络内访问


Dockerfile

Docker 镜像原理
  1. - 进程调度子系统
  2. - 进程通信子系统
  3. - 内存管理子系统
  4. - 设备管理子系统
  5. - 文件管理子系统
  6. - 网络通信子系统
  7. - 作业控制子系统
  8. 操作系统组成部分:
  9. Linux文件系统由bootfs和rootfs两部分组成
  10. - bootfs:包含bootloader(引导加载程序)和 kernel(内核)
  11. - rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
  12. - 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
复制代码
Docker镜像是由特殊的文件系统叠加而成


  • 最底端是 bootfs,并使用宿主机的bootfs
  • 第二层是 root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角 ,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称 为父镜像,最底部的镜像成为基础镜像。
  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读 写文件系统作为容器
思考:

Docker 镜像本质是什么?


  • 是一个分层文件系统
Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?


  • Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?


  • 由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的
    tomcat镜像大小500多MB
Docker 镜像如何制作?

容器转为镜像
  1. docker commit 容器id 镜像名称:版本号
  2. docker save -o 压缩文件名称 镜像名称:版本号
  3. docker load –i 压缩文件名称
复制代码
dockerfile


  • Dockerfile 是一个文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝移植
案例

使用commit构建镜像,修改nginx默认首页内容
  1. # 启动一个临时容器
  2. docker run --rm -d -p 80:80 --name n1 nginx
  3. # 进入临时容器
  4. docker exec -it n1 /bin/bash
  5. # 进入nginx挂载目录
  6. cd /usr/share/nginx/html/
  7. # 修改index.html内容
  8. echo '<h1>hello docker</h1>' > index.html
复制代码
  1. # 使用commit构建镜像
  2. docker commit -a "作者" -m "描述" n1 mynginx:1
  3. # 查看镜像
  4. docker images
  5. # 运行新镜像
  6. docker run -d --rm -p 80:80 --name n2 mynginx:1
复制代码

bulid常用命令
  1. #1,先指定当前镜像的基础镜像是什么
  2. FROM openjdk:8
  3. # 2,描述这个镜像的作者,以及联系方式 (可选)
  4. MAINTAINER test<xxx@qq.com>
  5. # 3,镜像的标签信息 (可选 )
  6. LABEL version="1."LABEL description="这是我的第一个 Dockerfile"
  7. # 4,环境变量配置
  8. ENV JAVA ENV dev
  9. ENV APP NAME test-dockerfile
  10. # ENV JAVA ENVdev APP NAME=test-dockerfile
  11. #5,在构建镜像时,需要执行的 shell 命令
  12. RUN Is -al
  13. RUN mkdir /www/dockerfile/test
  14. # 6,将主机中的指定文件复制到容器的目标位置,可以简单理解为 cp 命令
  15. # ADD /www/test/index.html /www/server
  16. ADD ["/www/test","/www/server"]
  17. #7,设置容器中的工作目录,如果该目录不存在,那么会自己创建
  18. WORKDIR /app
  19. # 在设置完工作目录后,执行 pwd 命令,打印的目录就是 /app
  20. RUN pwd
  21. # 8,镜像数据卷绑定,将主机中的指定目录挂载到容器中
  22. VOLUME ["/www/test"]
  23. # 9,设置容器启动后要暴露的端口
  24. EXPOSE 8080/tcp
  25. # CMD 和 ENTRYPOINT 选择其一即可,作用是描述镜像构建完成后,启动容器时默认执行的脚本
  26. # CMD ping 127.0.0.1
  27. # CMD ["sh",'-c","ping 127.0.0.1"]
  28. # ENTRYPONINT ping 127.9.0.1
  29. ENTRYPOINT "sh","-c","ping 127.0.0.1"
复制代码
拓展命令

  • ARG设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg =来指定参数
  • HEALTHCHECK 容器健康状况检查命令
    1. CMD与ENTRYPOINT的区别
    2. 相同点:
    复制代码
  • 在整个 Dockerfile 中只能设置一次,如果写了多次则只有量后一次生效
不同点:

  • ENTRYPOINT 不会被运行容器时指定的命令所覆盖,而CMD 会被覆盖
  • 如果同时设置了这两个指令,且 CMD 仅仅是选项而不是参数,CMD 中的内容会作为 ETRYPQINI 的参数(一股不这么)
  • 如果两个都是完整命令,那么只会执行最后一条
  1. #### bulid构建springboot容器并运行
  2. ##### 以jar的形式
  3. 一个简单的springboot项目,端口默认8080,提供了一个对外访问接口/hello
  4. ![image.png](https://cdn.nlark.com/yuque/0/2023/png/8364180/1691635749768-fcca8620-f2c1-4634-afd1-258fec3cf7da.png#averageHue=%231e1f22&clientId=u1e83b879-5788-4&from=paste&height=455&id=u52aa12dc&originHeight=910&originWidth=1774&originalType=binary&ratio=2&rotation=0&showTitle=false&size=176730&status=done&style=none&taskId=uaa3cee78-ae0f-41df-b397-34fb20dd4da&title=&width=887)
  5. ```java
  6. package com.example.demo.contorller;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. /**
  10. * @Description TODO
  11. * @Version 1.0.0
  12. * @Date 2023/8/10
  13. * @Author wandaren
  14. */
  15. @RestController
  16. public class HelloController {
  17.     @GetMapping("/hello")
  18.     public String hello(){
  19.         return "hello docker springboot!";
  20.     }
  21. }
复制代码
  1. # 创建目录
  2. mkdir springboot-docker
  3. cd springboot-docker
  4. # 创建Dockerfile
  5. touch Dockerfile
  6. # 将springboot启动jar拷贝到springboot-docker目录下,jar包与Dockerfile放在同级目录
复制代码
编写Dockerfile文件内容如下
  1. # 关联基础依赖
  2. FROM openjdk:17
  3. # 将项目jar包拷贝到容器中
  4. ADD *.jar /app.jar
  5. # 配置项目环境变量
  6. ENV APP_OPTS=""
  7. # JVM环境变量
  8. ENV JVM_OPTS="-Duser.tomezone=Asia/Shanghai -Xms128m -Xmx128m"
  9. # 暴露端口,与项目端口对应
  10. EXPOSE 8080
  11. # 设置启动时的命令
  12. ENTRYPOINT ["sh","-c","java $JVM_OPTS -jar /app.jar $APP_OPTS"]
复制代码
构建与测试
  1. # 最后一个参数为Dockerfile文件路径目录(springboot-docker),.表示同级目录下的Dockerfile
  2. docker build -t springboot-docker:1.0.0 .
  3. # 运行
  4. docker run --rm -d -p 8888:8080 springboot-docker:1.0.0
  5. # 访问http://localhost:8888/hello即可
复制代码
以war的形式部署到tomcat


  • 使用的是springboot3.1.2,tomcat10.1.11
改造springboot项目


  • 修改打包方式为war,排除springboot自带的tomcat
  1. <packaging>war</packaging>
  2. <dependency>
  3.   <groupId>org.springframework.boot</groupId>
  4.   <artifactId>spring-boot-starter-web</artifactId>
  5.   <exclusions>
  6.     <exclusion>
  7.       <groupId>org.springframework.boot</groupId>
  8.       <artifactId>spring-boot-starter-tomcat</artifactId>
  9.     </exclusion>
  10.   </exclusions>
  11. </dependency>
复制代码

  • 添加servle-api或者tomcat依赖,二选一即可
  1. <dependency>
  2.   <groupId>jakarta.servlet</groupId>
  3.   <artifactId>jakarta.servlet-api</artifactId>
  4.   <version>6.0.0</version>
  5.   <scope>provided</scope>
  6. </dependency>
  7. <dependency>
  8.     <groupId>org.springframework.boot</groupId>
  9.     <artifactId>spring-boot-starter-tomcat</artifactId>
  10.    
  11.     <scope>provided</scope>
  12. </dependency>
复制代码

  • 修改启动类,继承SpringBootServletInitializer重写configure方法
  1. package com.example.demo;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.builder.SpringApplicationBuilder;
  5. import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
  6. @SpringBootApplication
  7. public class DemoApplication extends SpringBootServletInitializer {
  8.         public static void main(String[] args) {
  9.                 SpringApplication.run(DemoApplication.class, args);
  10.         }
  11.         @Override
  12.         protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  13.                 // 注意这里要指向原先用main方法执行的Application启动类
  14.                 return builder.sources(DemoApplication.class);
  15.         }
  16. }
复制代码
编写Dockerfile,将war拷贝到Dockerfile同级目录下
  1. FROM tomcat:10.1.11
  2. WORKDIR /usr/local/tomcat/webapps
  3. # 拷贝到tomcat并改为ROOT解压之后更方便使用(访问可以不带路径)
  4. ADD *.war ROOT.war
  5. ENTRYPOINT ["sh","-c","../bin/catalina.sh run"]
复制代码

  • 构建与运行
  1. # 最后一个参数为Dockerfile文件路径目录(/Users/wandaren/tomcat-docker),会自动查找Dockerfile文件
  2. docker build -t javaweb /Users/wandaren/tomcat-docker
  3. docker run -d --rm -P javaweb
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表