Docker的整理

Posted by wantu on January 15, 2019

前言

docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器部署应用程序称为容器化。容器不是新的,但是它们用于轻松部署应用程序。
容器化的优势:
1、灵活,再复杂的应用也可以集装箱化。
2、轻量级,容器利用并共享主机内核。
3、可互换,支持即时部署更新和升级。
4、便携性,我们可以本地构建,部署到云,并在任何地方运行。
5、可扩展,我们可以增加并自动分发容器副本。
6、可堆叠,我们可以垂直和即时堆叠服务。
官方文档

正文

概念

镜像:通过运行镜像启动容器,镜像是一个可执行的包,它包含运行应用的所有的内容,包含代码、环境、配置文件等。
容器:容器是镜像的运行时的实例。可以使用docker ps 查看正在运行的容器列表。
容器和虚拟机的对比:
容器在Linux上运行,并于其他容器共享主机内核。它运行一个独立的进程,不占用任何其他的可执行文件的内存,这使得它十分的轻量。 相比之下,虚拟机运行一个完整的“客户”操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。通常,虚拟机提供的环境比大多数应用程序需要的资源多。
CE社区版、EE企业版量体裁衣咯。前者免费,后者收费,但是更安全,官网有详细叙述。

安装docker

TP 根据自己操作系统的不同自己选择安装方式。 看这里

镜像加速

dockerhub在墙外面,下镜像很慢。所以…

docker常用命令

版本:

1
2
docker --versioin 版本信息
docker info docker安装细节,为避免权限错误最好加sudo运行

帮助:

1
docker --help

镜像:

1
2
3
4
5
6
docker pull 拉取镜像,不指定Docker Registry默认Docker Hub
docker image ls/docker iamges  列出所有的镜像
docker system df 镜像体积
docker image prune 删除dangling image
docker image ls imageName 根据仓库名列出镜像
docker image rm imageName/imageId 删除本地镜像

容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker ps -l 列出最新创建的x个容器
docker ps -n=2 列出最后n个容器
docker container ls 列出正在运行的容器
docker container ls -a/--all 列出所有的容器
docker container ls -aq 列出所有的容器(q安静模式:只返回容器ID)
docker container run 镜像id 从镜像文件生成一个正在运行的容器
docker start containerId 启动某个(containerId)容器
docekr run --restart containerId 重启某个容器
docker run --restart=always containerId 
docker run -it -v /xxx/xx/x:/xx/x -p 4000:80 imageName 
    -it 交互式进入容器 -v磁盘映射(避免频繁地在两个系统中拷贝文件) -p端口映射(把本机4000端口映射到容器的80端口)
docker stop containerName/containerId 退出某个容器(容器名称好像不行)
docker kill containerName/containerId 强制退出某个容器
docker rm containerName/containerId 删除某个容器
docker rm 'docker ps -a -q' 列出所有容器,-q列出所有的容器的ID,然后传递给rm一次删除

构建:

1
docker build . 创建镜像使用当前目录作为上下文。大多数情况下最好从空目录(项目目录)开始作为上下文。

镜像构建

命令: docker build . -f:指定文件系统中一个Dockerfile的位置 -t:构建成功指定repository和tag

Dockerfile是一个描述组装镜像步骤的文档。一般而言Dockerfile是存于项目目录下的。特别注意不要将根目录作为PATH路径,因为会导致这次构建操作将磁盘驱动器的全部内容传输到Docker守护进程(daemon)中。也可以通过添加.dockerignore文件来排除某些文件和目录。
格式:

1
2
# Comment
INSTRUCTION arguments

官方样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

Dockerfile指令解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FROM:Dockerfile第一条语句,其指定了构建镜像的基础镜像。一个合法的Dockerfile必须以FROM开始。
    FROM <image> [AS <name>]
    FROM <image>[:<tag>] [AS <name>]
    FROM <image>[@<digest>] [AS <name>]
RUN:RUN指令将在当前镜像上的新的layer执行任何命令并提交结果。生成的已提交镜像用于Dockerfile的下一步。
    RUN <command>
    RUN ["executable","param1","param2"]
CMD:为执行容器提供默认值。
    CMD ["executable","param1","param2"] (首选形式)
    CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
    CMD command param1 param2 (shell form)
LABEL:给镜像添加备注信息。
    LABEL <key>=<value> <key>=<value> <key>=<value> 
MAINTAINER:指定镜像作者。
    MAINTAINER <name>
EXPOSE:通知Docker容器在运行时侦听执行的网络端口。
    EXPOSE <port> [<port>/<protocol>...]
ENV:设置环境变量。
    ENV <key> <value>
    ENV <key>=<value>
ADD:从src处复制新文件、目录、远程URL,并将它们添加到dest的镜像文件系统中。
    ADD [--chown=<user>:<group>] <src>... <dest>
    ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] (this form is required for paths containing whitespace)
COPY:从src处复制新文件、目录、远程URL,并将它们添加到dest的镜像文件系统中。
ENTRYPOINT:允许您配置将作为可执行文件运行的容器
VOLUME:
USER:
WORKDIR:为Dockerfile中的RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果目录不存在则创建。
ONBUILD:

总结