Docker 学习笔记

李德希

共 1977字,需浏览 4分钟

 ·

2021-11-26 23:59


docker是什么


官网:docker-cn.com


docker 是基于GO语言实现的云开源项目,其理念是“Build,Ship and Run Any App Anywhere",一次封装,到处运行.解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。




一、docker 的基本组成



7a0001b0907ff66bab78cd272158bd72.webp


1. 镜像(image)


   相当于一个文件系统,在Java面向对象中相当于类的概念,一个镜像可以有多个容器实例


2. 容器(Container)


   镜像的一个实例,容器是镜像运行时的实体,可以被创建、启动、停止、删除等


3. 仓库(Repository)


   存储镜像文件的场所




二、docker 安装




1. 卸载旧版本


   * yum remove docker \ docker-client \

     docker-client-latest \

     docker-common \

     docker-latest \

     docker-latest-logrotate \

     docker-logrotate \

     docker-engine  


2. 设置存储库


   * yum install -y yum-utils

   * yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo


3. 安装:yum install docker-ce docker-ce-cli containerd.io


4. 启动 :systemctl start docker


5. 配置镜像加速器


   * mkdir -p /etc/docker

   * tee /etc/docker/daemon.json <<-'EOF'

     {

     "registry-mirrors": ["https://dohgap5a.mirror.aliyuncs.com"]

     }

     EOF


6. systemctl daemon-reload

   systemctl restart docker


   


三、Docker 命令


1. 服务相关命令


* 启动docker服务


  systemctl start docker


* 停止docker服务


  systemctl stop docker


* 重启docker服务


  systemctl restart docker


* 查看docker服务状态


  systemctl status docker


* 开机启动docker服务


  systemctl enable docker


2. Docker镜像相关命令


* 查看镜像


  docker images


  docker images -q只显示id


* 搜索镜像


  以redis为例


  docker search redis


* 拉取镜像


  以redis为例


  docker pull redis[:version]


  docker pull redis:5.0.14


 注意


  版本号不加则默认latest最新的版本,具体支持的版本号可以去


  [dockerhub官网](hub.docker.com) 查看


* 删除镜像


  * docker rmi [镜像id]


  * docker rmi [镜像名称]:[版本号]


    docker rmi redis:5.0


    docker rmi  \`docker images -q\`删除所有镜像


    


 3.Docker容器命令


* 查看容器


  docker ps


  docker ps -a


* 创建并启动容器


  docker run [-it] --name=myRedis  redis: 5.0.14 /bin/bash


  -i:表示容器一直运行


  -t:给容器分配终端以执行命令


  -d:使用后台启动容器


  --name: 容器名称 


  /bin/bash :创建后进入容器,退出容器使用exit,使用-it创建容器退出容器后容器停止运行,使用-id创建的容器退出容器后容器后台运行,不会停止运行


* 进入容器


  docker exec -it 容器名称  /bin/bash


* 启动容器


  docker start 容器名称


* 停止容器


  docker stop 容器名称


* 删除容器


  docker rm 容器id或者容器名称


  docker rm \`docker ps -aq\`


  注*:容器的状态为运行中不能被删除


* 查看容器信息


  dokcer inspect 容器名称


四、Docker容器的数据卷


1.数据卷的概念及作用


* Docker容器删除后,在容器中产生的数据是否还存在?


  docker容器删除后,docker中的文件都删除了,但是数据卷目录还存在于宿主机中


* Dokcer容器和外部机器是否可以交换文件?


  docker容器通过数据卷与宿主机交换文件,宿主机通过网络与外部机器交换文件


* 容器之间如何进行数据交互?


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


数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。


0424bcec374b3a66066c000c6d49a114.webp



2.配置数据卷


* 创建启动容器时,使用 -v 参数设置数据卷


  docker run ... -v 宿主机目录(文件): 容器内目录(文件) ...


  注意:


  * 目录必须是绝对路径

  * 如果目录不存在会自动创建

  * 可以挂载多个数据卷,多加几个 -v 宿主机目录:容器内目录


3.数据卷容器


多容器进行数据交换


实现方式:


1. 多个容器挂载同一个数据卷


2. 数据卷容器


   * 创建启动数据卷容器,使用-v设置数据卷,会在宿主机自动创建一个数据卷以及在容器中创建一个volumn文件夹


     `docker run -it --name=c3 -v /volume redis:5.0.14 /bin/bash`


   * 创建启动c1,c2容器,使用 --volumes-from 参数设置数据卷


     `docker run -it --name=c1 --volumes-from c3 redis:5.0.14 /bin/bash`


     `docker run -it --name=c2 --volumes-from c3 redis:5.0.14 /bin/bash`


五、 Docker 应用部署



f773946a1055936c7a581b2c558606c4.webp




当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的该端口,从而间接访问容器的服务,这种操作叫**端口映射**


1. MySQL部署


* 搜索mysql镜像


  docker search mysql


* 拉取mysql镜像


  docker pull mysql:5.6


* 创建容器,设置端口映射、目录映射


  docker run -id \


  -p 3307:3306 \


  --name=mysql1 \


  -v $PWD/conf:/etc/mysql/conf.d \


  -v $PWD/logs:/logs \


  -v $PWD/data:/var/lib/mysql \


  -e MYSQL_ROOT_PASSWORD=lidexi \


  mysql:5.6 


  `参数说明:`


  * -p 3307:3306  :将容器中的3306端口映射到宿主机的3307端口

  * -v $PWD/conf:/etc/mysql/conf.d :将主机当前目录下的conf/my.cnf 挂载到容器的/etc/mysql/my.cnf。配置目录

  * -v $PWD/logs:/logs :将当前目录的logs目录挂载到容器的/logs。日志目录

  * -v $PWD/data:/var/lib/mysql :将当前目录下的data目录挂载到容器的/var/lib/mysql。数据目录

  * -e MYSQL_ROOT_PASSWORD=lidexi:初始化root用户的密码


* 操作容器中的mysql


  docker exec -it mysql1 /bin/bash


  mysql -uroot -plidexi


 2.Nginx部署


* 搜索Nginx镜像


  docker search nginx


* 拉取Nginx镜像


  docker pull nginx


* 创建容器


  `nginx.conf`


  


   

  user  nginx;      worker_processes  1;       error_log  /var/log/nginx/error.log warn;      pid        /var/run/nginx.pid;       events {          worker_connections  1024; #每个进程允许的最大连接数      }      http {      include       /etc/nginx/mime.types;      default_type  application/octet-stream;      log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '                        '$status $body_bytes_sent "$http_referer" '                        '"$http_user_agent" "$http_x_forwarded_for"';      access_log  /var/log/nginx/access.log  main;      sendfile        on;      #tcp_nopush     on;      keepalive_timeout  65;



include /etc/nginx/conf.d/*.conf; }


* 外部访问


六、 Dockerfile


 1.docker 镜像原理


* Docker镜像本质是什么


  操作系统由各种子系统组成,其中文件管理子系统又由bootfs和rootfs两部分组成,bootfs是开源的,不同的linux发行版的bootfs是一样的,不一样的是rootfs,bootfs包含bootloader(引导加载程序)和kernel(内核)。而rootfs包含/dev,/proc,/bin,/etc等标准目录和文件;


  Docker镜像由特殊的文件系统叠加而成,最底层是bootfs,并使用宿主机的bootfs,第二层为root文件系统,称为base image;然后再往上可以叠加其他的镜像文件。


* Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的ISO文件要几个G?


  docker中的centos镜像中的bootfs使用的是宿主机的bootfs,所以只有200MB


* Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?


  docker中的tomcat镜像除了tomcat安装包外,还依赖父镜像和基础镜像(如JDK),所有整个对外暴露的tomcat镜像就有500MB。


2. 镜像制作


* 容器转化为镜像


  docker commit 容器id 镜像名称:版本号(注:目录挂载的不会commit)


  docker save -o 压缩文件名称 镜像名称:版本号


  docker load -i 压缩文件名称


* dockerfile


  dockerfile是一个文本文件,包含了一条条指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像


关键字作用备注

FROM


指定父镜像指定dockerfile基于哪个image构建
MAINTAINER作者信息用来表明dockerfile文件是谁写的
LABEL标签表明dokcerfile的标签,可以使用LABEL代替MAINTAINER,最终可以在docker image基本信息中可以查看
RUN执行命令执行一段指令,默认/bin/sh格式:RUN command 或者 RUN [“command”,“param1”,“param2”]
CMD容器启动命令提供启动容器时的默认命令和ENTRYPOINT配合使用,格式CMD command param1 param2 或者 CMD [“command”,“params1“,”params2”]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用
COPY复制文件build的时候复制文件到image中
ADD添加文件build的时候添加文件到image中,不仅仅局限于当前build上下文,可以来源于远程服务
ENV环境变量指定build时候的环境变量,可以在启动容器的时候通过-e 覆盖,格式:name=value

ARG




构建参数构建参数,只在构建参数时使用的 参数,如果有ENV,那么ENV的相同名字值始终覆盖arg的参数
VOLUMN定义外部可以挂载的数据卷指定build的image哪些目录可以启动的时候挂载到文件系统中,启动的时候-v 绑定 格式:VOLUME [“目录”]
EXPOSE暴露端口定义容器运行时监听的端口,启动容器时使用-p 来绑定暴露端口,格式:EXPOSE 8080或者EXPOSE 8080/udp
WORKDIR工作目录指定容器内部的工作目录,如果没有创建则自动创建,如果使用/开头则是绝对路径,如果不是/开头则是上一条workdir路径的相对路径
USER指定执行用户指定build或者启动时用户在RUN CMD ENTRYPOINT执行时的用户
HEALTHCHECK健康检查指定检测当前容器的健康检测命令,基本上没什么用,因为基本上应用本身都有健康检测机制
ONBUILD触发器当存在ONBUILD关键字的镜像作为基础镜像时,当执行FROM完成后就会执行ONBUILD命令,但是不影响当前镜像,用处不大
STOPSIGNAL发送信号量到宿主机该指令设置将发送到容器的系统调用信号以退出
SHELL指定执行脚本的shell指定RUN CMD ENTRYPOINT执行命令时使用的shell

 3.案例


* 案例1:部署自己的springboot项目


  * dockerfile文件


  `FROM java:8`

  `MAINTAINER lidexi <2877728633@qq.com>`

  `ADD springboot.jar app.jar`

 ` CMD java -jar app.jar`


  * 构建镜像:docker build -f  dockerfile文件路径 -t app .

  * docker run -id -p 9000:8080 app


  


* 案例2:自定义centos


  * dockerfile文件


  `FROM centos:7`


  `MAINTAINER lidexi <2877728633@qq.com>`


  `RUN yum install -y vim`


  `WORKDIR /usr`


  `cmd /bin/bash`


  * 构建镜像:docker build -f dockerfile文件路径 -t my_centos:1 .

  * 运行:docker run -it --name=c2 my_centos:1


七、 Docker服务编排


1.  什么是服务编排


微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。服务编排就是按照一定的业务规则批量管理容器


 2. Docker Compose


Dokcer Compose 是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建、启动和停止。使用步骤:


* 利用Dockerfile定义运行环境镜像

* 使用docker-compose.yml定义组成应用的各服务

* 运行docker-compose up启动应用

3. dokcer compose 安装


docker-compose安装

docker-compose version,如果指令无输出,则说明docker-compose未安装。安装指令如下:


* 下载安装docker-compose,用的是非官方源,否则下载很慢

  curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

* 然后修改目录权限可执行

  chmod +x /usr/local/bin/docker-compose


 4.docker compose 卸载


rm /usr/local/bin/docker-compose


 5.使用docker compose 编排nginx+springboot项目


* 创建docker-compose.yml


  * vim docker-compose.yml



  version: '3'  services:    nginx:      image: nginx      ports:        - 80:80      links:        - app      volumes:        - ./nginx/conf.d:/etc/nginx/conf.d    app:      image: app      expose:        - "8080"

  * 创建nginx配置目录


    mkdir -p ./nginx/conf.d


  * 编写nginx配置文件


    vim lidexi.conf


  

 

  server{      listen 80;      access_log off;      location / {        proxy_pass http://app:8080      }    }

  


    


  * 启动(在docker-compose.yml目录下执行)


    docker-compose up -d(后端启动)


八、 Docker 私有仓库


1.搭建私有仓库


* 拉取私有仓库镜像


  docker pull registry


* 启动私有仓库容器


  docker run -id --name=registry -p 5000:5000 registry


* 修改daemon.json


  vim /etc/docker/daemon.json


  添加以下内容:


  {“insecure-registries":["私有仓库服务器ip:5000"]}


* 重启docker服务


  systemctl restart docker


  docker start registry


 2.将镜像推送到私有仓库


* docker tag app 192.168.139.128:5000/app

* docker push 192.168.139.128:5000/app

* 在浏览器输入http://192.168.139.128:5000/v2/_catalog,查看是否推送成功


95d5c996ff89a21d4ad924ce12ff4e2c.webp

 3.从私有仓库拉取镜像


docker pull 192.168.139.128:5000/app


浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报