Py学习  »  docker

Docker安装及使用教程

枫子奉 • 3 年前 • 214 次点击  
阅读 12

Docker安装及使用教程

■ 简介

Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition:社区版) 和 EE(Enterprise Edition:企业版),我们用社区版就可以了。

■ 基础概念

镜像(Image):Docker 镜像(Image)就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

■ 相关地址
■ 注意事项

如果使用的账号不是root账号,需要使用 sudo 前缀,使用root相关权限执行命令,后续命令中省略 sudo 命令,如果权限不足,请自行加上该前缀。

yum install xxx
sudo yum install xxx
复制代码
■ 卸载docker
# 删除相关组件
# 如果使用种方式的话,需要罗列全部使安装过的组件;
yum remove docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-selinux \
  docker-engine-selinux \
  docker-engine
                
# 第二种方式,使用匹配符直接删除全部
# 推荐使用第二种方式,无需罗列所有的安装组件
yum remove docker docker-*

# 删除注册的服务
rm -rf /etc/systemd/system/docker.service.d

# 删除docker工作目录
rm -rf /var/lib/docker*
rm -rf /var/run/docker*

# 删除配置文件
# 直接清空这个文件夹,下面所有配置都将被清空
rm -rf /etc/docker
#----------------------------#
# /etc/docker/daemon.json    #
# /ect/docker/key.json       #
#----------------------------#

# 查找残留的docker
rpm -qa|grep docker
复制代码
■ 安装docker
# 第一步,需要安装一些依赖组件
# 安装所需的软件包。yum-utils 提供了 yum-config-manager,
# 并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

# 使用以下命令来获得稳定的仓库
# 阿里云源地址速度相对比较快,这里是设置源地址为阿里云的镜像仓库地址。
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
# 安装 Docker Engine-Community
yum install -y docker-ce docker-ce-cli containerd.io

# 将当前用户添加到docker用户组
usermod -aG docker ${USER}

# Docker默认未启动,需要手动重启docker服务
systemctl restart docker
systemctl start docker
systemctl stop docker

# 切换当前会话到docker组
newgrp - docker
复制代码
■ docker镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://fpr97nhz.mirror.aliyuncs.com" ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
复制代码
■ docker常用命令

基础命令

# 查看docker基础信息
docker info

# 拉取镜像
docker pull <image>:<tag>

# 移除容器
docker rm <containerId>

# 移除镜像
docker rmi <imageId>

# 启动、停止、重启容器
docker stop <containerId>
docker start <containerId>
docker restart <containerId>
docker run -itd --name <imageName> -P/-p<port>:<port> <imageName> /bin/bash

# 查看docker容器
docker ps <-a>

# 打包镜像
docker tag <path>/<name> <remotePath>/<name>
docker push <remotePath>/<name>

# 登录docker
docker login <remoteIp>

# 进入容器内部
docker exec -it <containerId> /bin/bash

# 从仓库搜索镜像
docker search <imageName>
复制代码

批量操作

# 杀死所有正在运行的容器
docker kill $(docker ps -a -q)

# 删除所有的容器
docker rm $(docker ps -a -q)

# 删除所有未打 dangling 标签的镜
docker rmi $(docker images -q -f dangling=true)

# 删除所有镜像
docker rmi $(docker images -q)
docker rmi $(docker images -q)

# 强制删除无法删除的镜像
docker rmi -f <imageId>
docker rmi -f $(docker images -q)
复制代码
■ Dockerfile

Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取文件中的指令自动生成镜像。

脚本结构

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行指令
  5. ’#’ 为 Dockerfile 中的注释
  6. "&&" 符号连接命令,这样执行后,只会创建 1 层镜像

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本镜像,第一条指令必须是FROM。一个声明以字符开头则被视为注释。可以在Docker文件中使用RUNCMDFROMEXPOSEENV等指令。

# 基础镜像
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
FROM nginx:latest

# 维护者信息
MAINTAINER <author>
MAINTAINER tangxbai@hotmail.com

# ENV × N ...
# 设置镜像环境变量,仅在 Dockerfile 内有效
ENV <key> <value>
ENV <key>=<value> ...
ENV LANG=C.UTF-8

# ARG × N ...
# 用于指定传递给构建运行时的变量
ARG <name>[=<defaultValue>]
ARG site
ARG argName=defaultArgValue

# USER × N ...
# 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
USER <user>
USER <user>:<gid>
USER <user>:<group>
USER <uid>
USER <uid>:<gid>
USER <uid>:<group>
USER root

#


    
 用于为镜像添加元数据
LABEL <key>=<value> ...
LABEL version="1.0" description="Dockerfile"

# ONBUILD × N ...
# 当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发
ONBUILD [INSTRUCTION]
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

# RUN × N ...
# 构建镜像执行的命令
RUN <command>
RUN ["executable", "param1", "param2"]
RUN mkdir /path/to/workdir

# WORKDIR × N ...
# 设置工作目录,类似于cd命令,后续所有操作都会基于此目录进行操作
WORKDIR <path>
WORKDIR /path/to/workdir

# ADD × N ...
# 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] # 用于支持包含空格的路径
ADD target/project.jar /path/to/workdir

# COPY × N ...
# 功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
COPY <src>... <dest>
COPY ["<src>",... "<dest>"] # 用于支持包含空格的路径
COPY target/project.jar /path/to/workdir

# 用于将容器内的目录挂载到宿主机上
# 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
# 1、卷可以容器间共享和重用
# 2、容器并不一定要和其它容器共享卷
# 3、修改卷后会立即生效
# 4、对卷的修改不会对镜像产生影响
# 5、卷会一直存在,直到没有任何容器在使用它
VOLUME <path>
VOLUME /var/www /var/log/log1 /var/log/log2

# 指定于外界交互的端口
# 注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
EXPOSE <port>/<protocol> ...
EXPOSE 80 443 8080
EXPOSE 80/tcp 8080/udp

# 配置容器,使其可执行化,配合CMD可省去"application",只使用参数。
# ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
ENTRYPOINT java -jar project.jar -Dspring.profiles.active=dev

# CMD × N ...
# 构建容器后调用,也就是在容器启动时才进行执行
# CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
CMD <command>
CMD ["executable", "param1", "param2"]
CMD ["param1","param2"]
CMD java -jar project.jar
复制代码

构建命令

Dockerfile文件的存放目录下,执行构建动作。 以下示例,通过目录下的 Dockerfile 构建一个 image:tag(镜像名称:镜像标签)。

docker build -t <image>:<tag> .
docker build -t -f /path/to/a/Dockerfile <image>:<tag> .
复制代码
  • docker build:用 Dockerfile 构建镜像的命令关键词。

  • -t(target):指定镜像名字

  • -f(file):显示指定构建镜像的 Dockerfile 文件(Dockerfile 可不在当前路径下)

  • 如果不使用 -f,则默认将上下文路径下的名为 Dockerfile 的文件认为是构建镜像的 "Dockerfile"

  • ".":当前上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

最后找了一张很形象的图

Dockerfile

■ docker-compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

安装插件

# 下载docker-compose插件
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 增加文件可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 创建软连接,以至于可以直接使用在任何目录使用docker-compose命令
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 测试是否安装成功
docker-compose --version
复制代码

基础命令

docker-compose version
docker-compose -f <path>/<yaml> start

# 显示正在运行的进程
docker-compose top

docker-compose start 
docker-compose restart
docker-compose stop
docker-compose up -d
docker-compose down -v
复制代码

注意:docker-compose.yaml必须和命令在同一目录

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70787
 
214 次点击