Docker

118 阅读2分钟

Docker

安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。

#下载docker
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
#启动docker
sudo systemctl enable docker
sudo systemctl start docker
#创建docker用户组
sudo groupadd docker
#将当前用户加入docker组
sudo usermod -aG docker $USER

概念

镜像(image)

镜像是原子化的 逻辑镜像=物理镜像+环境镜像+OS镜像 逻辑镜像是应用模板

容器(container)

容器本质上是多个镜像加载到内存中的副本的组合,因此容器是OS级别的隔离,最终表现为精简的OS+运行需要的环境+对应的应用,比如tomcat容器就是精简的OS+jdk+tomcat。 镜像每次运行之后就产生一个容器,容器就是镜像实例,也就是应用。

仓库(repository)

用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置,有远程和本地仓库之分。

  • 本地仓库

  • 设置远程阿里云镜像仓库

    • 1.获取镜像仓库地址

      登陆阿里云控制台--->搜索容器镜像服务–-->镜像加速器–-->获取加速器地址

    • 2.设置

      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
        "registry-mirrors": ["镜像仓库链接"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      

数据卷(volume)

宿主机目录和容器内目录进行绑定以同步 只有在创建容器的时候才可以进行绑定

Dockerfile

Dockerfile是一个文件,内容是镜像产生需要执行的语句。 Dockerfile中一个命令或注释独占一行

- FROM
  FROM  镜像名:版本
基于这个镜像进行构建,必须作为Dockerfile的第一个指令出现。
- RUN
  RUN 命令
在当前工作目录下执行后面的命令
- WORKDIR
  WORKDIR 目录
相当于cd到指定目录,如果这个目录不存在,它将被创建。
且进入容器时会进入到最后指定的目录
- ENV
  ENV 变量=值
设置环境变量,用的时候这样:$变量。
- ADD
  ADD 本地文件路径/远程文件url 容器中路径    
复制本地文件或远程文件到容器指定路径的中
- CMD
  CMD 命令
指定容器启动时执行的命令,只有最后一个(所有容器Dockerfile的CMD的最后一个)才会生效。
- #
  注释

架构图

docker-compose

用来启动容器,不用我们关心启动顺序了。 把它下载到/usr/local/bin目录下并改名为docker-compose,然后增加执行权限。 写好docker-compose.yml(这个文件里的内容和docker run的东西是等价的),再启动项目。

#启动项目
docker-compose 
【-f  docker-compose.yml的路径】
【-d 】(后台启动)
 up

#关闭用docker-compose启动的所有容器
docker-compose 
【-f  docker-compose.yml的路径】
down 

docker-compose文件模板

#docker-compose的版本
version: "3.8"
#一组容器
services:
  #容器(自定义),默认生成的容器名为:项目名(docker-compose.yml所在目录的目录名)_容器_序号。
  container1:
      #镜像
    image: image1
    #通过Dockerfile构建镜像然后运行
    build: /dir/of/Dockerfile
    #容器名
    container_name: container-name 
    #端口映射(可多个) 宿主主机端口:容器端口 
    ports:
      - 80:80
    #数据卷(可多个) 宿主主机文件(必须已存在):容器文件
    volumes:
      - /path/in/host:/path/in/container
    #环境变量(可多个)
    environment:
      - var=value
    #覆盖容器启动时执行的命令
    command: new-command
    #先启动这些,再启动本身.
    depends_on:
      - 服务1

Docker相关命令

镜像相关

  • 查看已有的镜像

    docker images
    【-q】只显示image-id
    
  • 移除镜像

    docker image rm -f 镜像 
    docker image rm -f $(docker images -q) #删除全部镜像
    
  • 从远程仓库拉取镜像到本地仓库

    docker pull 镜像
    
  • 本地仓库镜像打包

    docker save 镜像名/id:版本 -o 镜像包路径
    打包之后的镜像就是一个文件
    
  • 镜像包导入本地仓库

    docker load -i 镜像包路径
    
  • 从Dockerfile构建镜像

    docker build -t 镜像名:版本 -f Dockerfile路径 上下文目录(里面存放了构建需要的文件,Dockerfile里面需要复制的文件都是以这个目录为当前目录的,且路径不能写出这个目录。)
    

    容器相关

  • 利用镜像创建并启动容器

    docker run 
    【-d】(后台运行)
    【-p  宿主机端口:容器所在OS端口】(宿主机端口和容器所在OS端口映射)
    【--name 名字】(给容器命名)
    【-v 宿主机目录绝对路径/任意别名:容器内目录路径】
    (数据卷(volume),即宿主机目录和容器内目录进行绑定以同步。
    如果宿主机目录路径是绝对路径,则创建容器时宿主机目录会覆盖容器内目录;如果是别名则会在创建容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中(/var/lib/docker/volumes/别名/_data)。)
    【-e var=value】(传递需要的环境变量(参数))
    镜像
    【容器启动时执行的命令】(一般会有默认的命令)
    
    需要绑定的文件:
    mysql:数据文件 /var/lib/mysql
    nginx:配置文件 /etc/nginx/nginx.conf
             数据文件 /usr/share/nginx/xxx
    redis:数据文件 /data
            配置文件(自己定义) 一般路径为
            /etc/redis-6.0.6/redis.conf
    
    需要的环境变量(参数):
    mysql: 
    MYSQL_ROOT_PASSWORD=密码(设置mysql中root的密码)
    
  • 移除容器

    docker rm -f 容器名
    docker rm -f $(docker ps -aq) #移除所有容器
    
  • 进入容器

    docker exec -it 容器名/id bash
    
  • 复制文件

    docker cp 容器名/id:文件路径 文件路径  #从容器复制文件到宿主主机
    docker cp 文件路径 容器名/id:文件路径  #从宿主主机复制文件到容器
    
  • 查询容器

    docker ps
    【-a】(所有容器,包括运行的和没有运行的。)
    【-q】(只显示容器id)
    
  • 启动容器

    docker start   容器名/id
    
  • 停止容器

    docker stop 容器名/id
    
  • 重启容器

    docker restart 容器名/id
    
  • 查看容器内应用的信息

    docker inspect 容器名/id
    
  • 将容器提交为镜像添加到本地仓库中

    docker commit 容器名/id 镜像名:版本
    
  • 查看日志

    这里的日志就是应用的输出

    docker logs 
    【-f】实时刷新
    容器名/id