社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

Docker安装及使用教程

枫子奉 • 5 年前 • 231 次点击  
阅读 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
 
231 次点击