sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Docker学习总结

docker其实就是帮助我们在linux上安装各种软件的小帮手。我是这么认为的哈,他里面引入了两个概念,镜像和容器,镜像就是我们所要安装的软件,只不过是docker所需要的格式,容器就是镜像运行的地方。相当于一个小型linux系统。


Docker初识

- Docker是一个开源的应用容器引擎,官网:https://www.docker.com
- 诞生于2013年初,基于Go语言实现, dotCloud公司出品(后改名为Docker Inc)
- Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。
- 容器是完全使用沙箱机制,相互隔离。

 

* 仓库(Repository):
    - 仓库是集中存放镜像文件的场所。
    - 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    
* 镜像(Image)
    - 就是一个只读模板,比如:一个镜像可以包含一个完整的CentOS,里面仅安装jdk或用户的其他应用。
    - 镜像可以用来创建docker容器。

* 容器(Container):
    - 镜像和容器的关系,就像是Java中的类和对象一样。
    - 容器是从镜像创建的运行实例,它可以被启动、停止、 删除。
    - 每个容器都是相互隔离的、保证安全的平台。
    - 可以把容器看做是一个简易版的Linux 环境(包括root用户权限、进程空间、用户空间)和运行在其中的应用程序。

 


基于CentOS 7安装Docker:

  1. # 1、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
  2. yum install -y yum-utils device-mapper-persistent-data lvm2
  3. # 2、设置yum源
  4. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  5. # 3、安装docker,出现输入的界面都按 y
  6. yum install -y docker-ce
  7. # 4、查看docker版本,验证是否验证成功
  8. docker -v
  9. # 5、启动docker环境
  10. systemctl start docker
  11. # 6、设置开机自启动
  12. systemctl enable docker

配置镜像加速器

默认情况下,将来从docker hub(Docker Hub)上下载docker镜像,太慢。一般都会配置镜像加速器:

创建或修改 /etc/docker/daemon.json文件,修改为如下形式:

  1. # 中国科技大学镜像地址
  2. {
  3. "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
  4. }
  5. # 网易云镜像地址
  6. {
  7. "registry-mirrors":["http://hub-mirror.c.163.com"]
  8. }
  9. # 阿里云镜像,需要自己手动生成的加速地址:https://cr.console.aliyun.com/
  1. # 重启docker
  2. systemctl restart docker
  3. # 查看是否成功
  4. docker info

Docker常用命令(重点)

进程相关命令

  1. # 启动服务
  2. systemctl start docker
  3. # 停止服务
  4. systemctl stop docker
  5. # 重启服务
  6. systemctl restart docker
  7. # 查看服务的状态
  8. systemctl status docker
  9. # 设置开机自启动
  10. systemctl enable docker

镜像相关命令

  1. # 查看本地镜像
  2. docker images
  3. # 搜索镜像仓库,推荐:https://hub.docker.com/
  4. docker search 镜像名称
  5. # 下载(拉取)镜像,镜像名称格式为 名称:版本号
  6. docker pull 镜像名称
  7. # 删除镜像(慎重)
  8. docker rmi 镜像名称

容器相关命令

  1. # 查看本地容器
  2. docker ps # 能查看正在运行
  3. docker ps -a # 能查看所有的容器(运行的和停止的)
  4. # 创建一个新的容器并运行(-d 后台运行容器,并返回容器ID -p 主机端口:容器端口 指定映射关系)
  5. docker run -d -p 80:80 --name=容器名 镜像名称
  6. # 进入容器内部
  7. docker exec -it 容器名称 /bin/bash
  8. # 查看容器信息
  9. docker inspect 容器名称
  10. # 启动容器
  11. docker start 容器名称
  12. # 停止容器
  13. docker stop 容器名称
  14. # 删除容器
  15. docker rm 容器名称

 

如果服务器提示你

说明你的linux服务关闭了请求转发功能, docker容器访问一般是需要做转发的,怎么开启呢?

修改文件vim /usr/lib/sysctl.d/00-system.conf,在最后追加一行net.ipv4.ip_forward=1

改完之后需要重启网络服务systemctl restart network

 


Docker部署程序

部署MySQL

  1. # 搜索mysql镜像
  2. docker search mysql
  3. # 拉取mysql镜像
  4. docker pull mysql:5.7
  5. # 创建并启动容器
  6. docker run -d -p 3306:3306 --name=mysql5.7 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 \
  7. --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

部署Tomcat

  1. # 搜索tomcat镜像
  2. docker search tomcat
  3. # 拉取tomcat镜像
  4. docker pull tomcat:8.5
  5. # 创建并启动容器
  6. docker run -d --name=tomcat8.5 -p 8080:8080 tomcat:8.5
  7. # 在本地模拟一个项目(创建一个hello目录,然后向目录中输出一个文件index.html,内容为hello world)
  8. mkdir ./hello
  9. echo "hello world" > ./hello/index.html
  10. # 从宿主机复制文件到容器(docker cp 宿主机路径 容器名称:容器路径)
  11. docker cp ./hello tomcat8.5:/usr/local/tomcat/webapps/

部署Redis

  1. # 搜索redis镜像
  2. docker search redis
  3. # 拉取redis镜像
  4. docker pull redis:5.0
  5. # 创建并启动容器
  6. docker run -d --name=redis5.0 -p 6379:6379 redis:5.0

 

部署Nginx

  1. # 搜索nginx镜像
  2. docker search nginx
  3. # 拉取tomcat镜像
  4. docker pull nginx
  5. # 创建并启动容器
  6. docker run -d --name=nginx -p 80:80 nginx

DockerCompose

Compose介绍

* 在以后的开发中,可能存在同一环境中出现多个程序的情况,这些程序都会单独的作为容器启动,比如说:
    container-order  订单程序
    container-user   用户程序
    container-redis  redis
    container-mysql  mysql
* 这些容器需要同时启动,同时停止,如果我们一个个的去操作,就会变的很麻烦,这时候我们就需要一个批量操作容器的工具


* Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用
* Compose通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景

 

Compose安装

  1. # 安装docekr compose 工具
  2. curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  3. # 设置权限
  4. chmod +x /usr/local/bin/docker-compose
  5. # 查看版本
  6. docker-compose -version

Compose案例

通过docker compose进行容器批量管理:一次性启动三个容器(nginx,tomcat,redis)

1) 创建docker-compose目录

  1. mkdir ~/docker-compose
  2. cd ~/docker-compose

2) 创建docker-compose.yml文件,内容如下

  1. version: '3'
  2. services:
  3. nginx:
  4. container_name: my_nginx
  5. image: nginx
  6. ports:
  7. - 80:80
  8. tomcat:
  9. container_name: my_tomcat
  10. image: tomcat:8.5
  11. ports:
  12. - 8080:8080
  13. redis:
  14. container_name: my_redis
  15. image: redis:5.0
  16. ports:
  17. - 6379:6379

3) 启动容器

  1. # 为了演示效果更佳明显,我们使用下面命令先停止并删除所有容器
  2. docker stop $(docker ps -q)
  3. docker rm $(docker ps -aq)
  4. # 执行命令,启动容器
  5. # 执行此命令的时候,需要和配置文件在同一个目录下
  6. docker-compose up -d

4) 停止并删除容器  

  1. # 执行此命令的时候,需要和配置文件在同一个目录下
  2. docker-compose down


 

Docker数据卷(重点)

数据卷概念

思考这样两问题:

  • Docker容器删除后,容器中的数据会不会永久丢失,如果是,岂不是很危险?

  • 容器之间可不可以实现文件的共享呢?

数据卷:

  • 数据卷是宿主机中的一个目录或文件,它可以被挂载到容器中,在容器中对它的操作可以直接反应到宿主机上

  • 一个容器可以被挂载多个数据卷,一个数据卷也可以被多个容器同时挂载

 

 

配置数据卷

 

  1. # 在/root目录下创建tomcat目录用于存储tomcat数据信息
  2. mkdir -p /root/tomcat/webapps
  3. # 创建容器,设置端口映射、目录映射
  4. # docker run ... –v 宿主机目录(文件):容器内目录(文件) ...
  5. docker run -d --name=tomcat1 -p 8081:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5
  6. docker run -d --name=tomcat2 -p 8082:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8.5

Docker镜像制作

镜像构成

Docker镜像是一个分层文件系统,最底端是bootfs,它会直接使用宿主机的bootfs;第二层是root文件系统rootfs,称为base image

然后再往上可以叠加其他的镜像文件,一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。

 

 

使用容器制作镜像

docker允许将一个容器直接转化为镜像,使用的命令如下:

docker commit 容器id 镜像名称:版本号

 案例:修改当前的nginx容器中的index.html文件内容为hehe,然后将修改后的容器做成一个名为mynginx:hehe的镜像

  1. #1. 查看当前正在运行的容器
  2. [root@itcast ~]# docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 0ce0bf14399d nginx "/docker-entrypoint.…" 14 hours ago Up 14 hours 0.0.0.0:80->80/tcp nginx
  5. #2. 进入nginx容器,然后向主页面覆盖写入"hehe",然后退出容器
  6. [root@itcast ~]# docker exec -it nginx /bin/bash
  7. root@0ce0bf14399d:/# echo "hehe" > /usr/share/nginx/html/index.html
  8. root@0ce0bf14399d:/# exit
  9. #3. 将修改之后的容器生成为mynginx:hehe镜像
  10. [root@itcast ~]# docker commit nginx mynginx:hehe
  11. sha256:139a9ea6a6008bc5557566e54316ccd8b93f508dba1daf7296235a461c8d471e
  12. #4. 查看镜像
  13. [root@itcast ~]# docker images
  14. REPOSITORY TAG IMAGE ID CREATED SIZE
  15. mynginx hehe 139a9ea6a600 8 seconds ago 133MB

 

 

使用Dockerfile制作镜像

Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响。

 

案例:基于jdk1.8环境运行springboot项目,打包为镜像  

 1) 将springboot-hello-0.0.1-SNAPSHOT.jar上传到linux

 2)创建一个springboot-dockerfile文件,内容如下

 

  1. # 定义基础镜像(从哪个镜像的基础上开始做)
  2. FROM java:8
  3. # 定义作者信息(可以省略)
  4. MAINTAINER itheima <itheima@itcast.cn>
  5. # 将jar包添加到容器,并改名为app.jar
  6. ADD springboot-hello-0.0.1-SNAPSHOT.jar app.jar
  7. # 镜像启动容器的时候,执行的命令
  8. CMD java -jar app.jar

3) 通过dockerfile构建镜像

  1. # -f :指定要使用的Dockerfile路径 -t :指定生成的镜像名称 . 镜像构建过程中的上下文环境的目录
  2. docker build -f ./springboot-dockerfile -t app-itheima .

4) 查看生成的镜像,并运行为容器

  1. [root@itcast ~]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. app-itheima latest 663f3e3e33fb 35 minutes ago 661MB
  4. [root@itcast ~]# docker run -d -p 18080:8080 app-itheima:latest
  5. 5ea166a3dbec4c091d7a70f84b75703f55a9ccd93f3a45466e4eeb9ac56fdb17
  6. [root@itcast ~]#
  7. [root@itcast ~]# docker ps
  8. CONTAINER ID IMAGE COMMAND CREATED PORTS NAMES
  9. 5ea166a3dbec app-itheima:latest "/bin/sh -c 'java -j…" 7 seconds ago 0.0.0.0:18080->8080/tcp serene_antonelli

5)访问测试  

镜像导入导出(扩展)

需求:将mynginx:hehe镜像共享给其他人,或者是将别人共享给的镜像包导入到系统中

  1. # 将镜像保存成tar包: docker save -o 包名 镜像:版本
  2. [root@itcast ~]# docker save -o mynginx.tar mynginx:hehe
  3. [root@itcast ~]# ls
  4. mynginx.tar
  5. # 接下来删除我们本地的mynginx:hehe镜像
  6. [root@itcast ~]# docker rmi mynginx:hehe
  7. Untagged: mynginx:hehe
  8. Deleted: sha256:0121bd7115b67719cc215cea3c2a2b090c0a42a1d70cbd46d4d243fa9c8b0edd
  9. # 然后再从tar包中将镜像导入到本机
  10. [root@itcast ~]# docker load -i mynginx.tar
  11. Loaded image: mynginx:hehe

Docker和VM对比【了解】

 

相同:

  • 容器和虚拟机具有相似的资源隔离和分配优势

不同:

  • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。

  • 传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统

特性容器虚拟机
启动秒级分钟级
硬盘使用一般为MB一般为GB
CPU/内存消耗
系统支持量单机支持上百个容器一般十几个

 

https://blog.csdn.net/weixin_65549694/article/details/125766861
posted on 2022-09-05 19:38  sunny123456  阅读(73)  评论(0编辑  收藏  举报