Docker小记 — Docker Engine
前言
用了 Docker 方才觉得生产环境终于有了他该有的样子,就像集装箱普及之后大型货轮的价值才逐渐体现出来,Docker 详细说明可查阅“官方文档”。本篇为 Docker Engine 的笔记,也就是我们通常说的 Docker,他包含了提供容器技术实现的 Docker daemon 及终端控制 Docker CLI 的应用程序。后续会继续发布 Docker Compose 和 Docker Swarm 的操作笔记,由于我的绝大部分应用案例都是云服务器,因此 Docker Machine 就略过了。

1. Docker 安装 & 配置镜像加速器
a:
# step 1:安装必要的一些系统工具
apt update
apt -y install apt-transport-https ca-certificates curl software-properties-common
# step 2:安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
# Step 3:写入软件源信息
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4:更新并安装 Docker-CE
apt -y update
apt -y install docker-ce
b:
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jrzzvzok.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
2. Dockerfile 详解
Docker 的架构很有魅力,他拥有类似于虚拟机性质的隔离机制,但并不是严格意义上的虚拟机。我还是喜欢拿货轮举例,以前我们是一条小船运一个集装箱的货物,现在可以把 N 个集装箱扔到一条大货轮上。每个容器(集装箱)共用宿主机(货轮)的内核(运载力),Dockerfile 就像是每个集装箱中的货物清单和说明书,一般由以下五部分构成:
2.1 基础指令
- FROM: 指定基础镜像,且必须位于第一行,使用格式如下:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
Docker 的原理基于 Linux 内核的隔离技术,且 Linux From Scratch,因此 FROM scratch 是 docker 中最基础的镜像,debian、ubuntu 和 centos 等都基于 scratch 之上。在实际的运用中,如果必须从零开始搭建镜像的一般都选择 FROM debian 作为基础镜像,不过大多数情况下一般都会以如下:FROM python、FROM nginx、FROM java 等为基础镜像。
- MAINTAINER:指定维护者信息,例:
MAINTAINER user user@mail.com。
2.2 控制指令
- RUN: 在构建的过程中指定需要被执行的命令,使用格式如下:
RUN command param1 param2 # 更推荐
RUN ["executable","param1","param2"]
- WORKDIR: 用于切换构建过程中的工作目录,例:
WORKDIR project。可配合环境变量使用,例:
ENV BASEDIR /project
WORKDIR $BASEDIR/test
- ONBUILD: 在当前镜像被当做基础镜像时,执行其携带指令,例:
ONBUILD RUN echo "hello world"
“hello world”会在子镜像被构建的过程中输出。
2.3 引入指令
- COPY: 拷贝文件或目录,格式:
COPY <src> <dest>
COPY ["<src>","<dest>"]
- ADD: 在COPY的基础之上,ADD可识别压缩文件,例:
ADD rootfs.tar.xz /。理论上也可添加网络地址,但还是建议在 RUN 指令中执行 wget 或 curl 命令,感觉这样更加可控。实际应用中我喜欢将 COPY 用于文件,ADD 用于目录(仅我个人的使用习惯)。
2.4 执行指令
- CMD: 容器启动时需要执行的命令,格式:
CMD ["executable","param1","param2"] # 更推荐
CMD ["param1","param2"]
CMD command param1 param2
若在 docker run 中指定启动命令,则 CMD 将被覆盖。
- ENTRYPOINT:主程序启动前的准备指令,用于启动主程序所依赖的服务,格式同CMD(基本上没用过就不介绍了,而且容易出错,不推荐使用)。
2.5 配置指令
- EXPOSE: 暴露容器端口,格式:
EXPOSE <port> [<port>...],注意此处的暴露端口和docker run 中-p指定的映射端口是两个概念。 - ENV: 声明环境变量,格式:
ENV <key>=<value> ...。 - LABEL: 标记,格式:
LABEL <key>=<value>...。 - USER: 设置启动容器的用户,格式:
USER daemo。 - ARG: 设置变量,格式同ENV。
- STOPSIGNAL: 容器停止时给应用程序发出的信号,例:
STOPSIGNAL SIGKELL。 - SHELL: 指定shell,例:
SHELL ["bash","-c"]。
3. Docker 命令详解
为了避免喧宾夺主,此处仅摘录我个人操作中较为常用的命令。
3.1 生命周期管理
- run: 创建并运行容器,格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...],参数说明:
-d , --detach # 后台运行
-it, --interactive tty # 交互终端形式运行
-p , --publish list # 指定端口
-v , --volume list # 挂载存储卷
--name string # 定义名字
--rm # 容器终止后自动删除(不支持在后台运行的容器)
--restart string # no、on-failure(非正常退出时重启,on-failure:3 最多重启三次)、always、unless-stopped
docker run 的参数甚多,可通过 --help 查询,后续这些复杂的配置都会移交给 Docker Compose,以上几个足以应用70%~80%的场景,例:
# 类似 ubuntu 这类容器必须以 -it 交互终端形式运行,否则无法在后台保留
docker run -it -d --name my-ubuntu ubuntu
# 端口映射和挂载数据卷
docker run -d \
-p 8080:80 \
-v /data/www:/usr/share/nginx/html\
--name my-nginx nginx
- start/stop/restart:
docker start/stop/restart my-container。 - rm:移除容器,格式:
docker rm [OPTIONS] CONTAINER [CONTAINER...],参数说明:
-f, --force Force the removal of a running container
-l, --link Remove the specified link
-v, --volumes Remove the volumes associated with the container
- exec:在运行的容器中执行命令,不过更常用的还是先进入容器再执行命令,例子:
docker exec -it my-nginx bash。
3.2 容器操作
- ps: 列出容器,常用:
docker ps -anq,参数说明:all、n last(最新 n 个容器)、quiet(只显示容器编号)。 - top: 查看容器中的进程信息,例:
docker top my-container。 - logs: 查看容器日志,常用:
docker logs -f --tail,参数说明:follow、--tail n(最新条日志)。 - port:查看端口映射情况,例:
docker port my-container。
3.3 镜像仓库
- login/logout: 镜像仓库的登录和退出,格式:
docker login [OPTIONS] [SERVER]
docker logout [SERVER]
如果是Docker Hub,则示例如下:
docker login -u username -p passward
docker logout
在生产环境中,我们一般会选择使用云厂商的镜像仓库,例:
docker login -u yo****@qq.com -p ****** registry-vpc.cn-hangzhou.aliyuncs.com
docker logout registry-vpc.cn-hangzhou.aliyuncs.com
- pull: 拉取镜像,最常用的命令之一,格式:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]。 - push: 上传镜像,格式:
docker push [OPTIONS] NAME[:TAG]。
3.4 本地镜像管理
- images: 列出本地镜像,常用
docker images -q,参数说明:quiet(只显示image Id)。 - rmi: 删除本地镜像,常用
docker rmi -f,参数说明:force。 - tag: 标记镜像,归入仓库,格式:
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG],例:docker tag ubuntu youclk/my-ubuntu:v1。 - build: 使用Dockerfile创建镜像,格式:
docker build [OPTIONS] PATH | URL | -,参数说明:-t tag 例:docker build -t youclk/my-ubuntu:v1 .。
结语
静夜听钟却念念不安,举首相望,恐知者唯灯而~ 哀哉!整理至此,小弟拙笔盼君悦之。
我的公众号《有刻》,我们共同成长!

Docker小记 — Docker Engine的更多相关文章
- Docker 小记 — Docker Engine
前言 用了 Docker 方才觉得生产环境终于有了他该有的样子,就像集装箱普及之后大型货轮的价值才逐渐体现出来,Docker 详细说明可查阅"官方文档".本篇为 Docker En ...
- [问题] docker: Failed to start Docker Application Container Engine.
docker无法启动: # systemctl restart docker Job for docker.service failed because the control process exi ...
- Failed to start Docker Application Container Engine.
[root@dockertest ~]# systemctl status docker.service● docker.service - Docker Application Container ...
- 启动docker报Failed to start Docker Application Container Engine.解决
[root@docker ~]# systemctl status docker.service● docker.service - Docker Application Container Engi ...
- docker起不来报错:Failed to start Docker Application Container Engine.
报错信息如下: [root@localhost localdisk]# systemctl restart docker Job for docker.service failed because t ...
- docker开启remote-api 2375端口后,Failed to start Docker Application Container Engine,重启docker失败的问题解决
1. 按照网上的教程修改了 /usr/lib/systemd/system/docerk.service配置后,重启失败.修改/etc/docker/daemon.json 增加hosts后重启也是 ...
- Docker容器启动失败 Failed to start Docker Application Container Engine
1.在k8s mster节点执行 1.kubectl get nodes 发现node节点没起来 [root@guanbin-k8s-master ~]# kubectl get nodes NAME ...
- Docker 小记 — Compose & Swarm
前言 任何相对完整的应用服务都不可能是由单一的程序来完成支持,计划使用 Docker 来部署的服务更是如此.大型服务需要进行拆分,形成微服务集群方能增强其稳定性和可维护性.本篇随笔将对 Docker ...
- Docker小记
1.Docker的安装 这里给一个比较通用的教程 Ubuntu 14.04 16.04 (使用apt-get进行安装) # step : 安装必要的一些系统工具 sudo apt-get update ...
随机推荐
- Dora.Interception, 一个为.NET Core度身打造的AOP框架[3]:Interceptor的注册
在<不一样的Interceptor>中我们着重介绍了Dora.Interception中最为核心的对象Interceptor,以及定义Interceptor类型的一些约定.由于Interc ...
- 程序员是这样区分Null和Undefined
Null类型 Null类型是第二个只有一个值的数据类型,这个特殊的值是null.从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"obje ...
- ASP.NET core1.0 EF MYSQL搭建中碰到几个问题记录
1.No executable found matching command "dotnet-ef" 看了网上各种办法都没用,最后选择"个人用户账户"创建项 ...
- 为了解决linux配置Nginx 只能关闭防火墙才能访问的问题
使用Nginx和iptables做访问权限控制(IP和MAC) 之前配置的服务器,相当于对整个内网都是公开的,而且,除了可以通过80端口的nginx来间接访问各项服务,也可以绕过nginx,直 ...
- XHR
xhr注入 XHR 注入技术是通过XMLHttpRequest来获取javascript的.但与eval不同的是,该机制是通过创建一个script的DOM元素,然后把XMLHttpRequest的响应 ...
- java实现最小生成树的prim算法和kruskal算法
在边赋权图中,权值总和最小的生成树称为最小生成树.构造最小生成树有两种算法,分别是prim算法和kruskal算法.在边赋权图中,如下图所示: 在上述赋权图中,可以看到图的顶点编号和顶点之间邻接边的权 ...
- Python 3 生成手写体数字数据集
0.引言 平时上网干啥的基本上都会接触验证码,或者在机器学习学习过程中,大家或许会接触过手写体识别/验证码识别之类问题,会用到手写体的数据集: 自己尝试写了一个生成手写体图片的python程序,在此分 ...
- 洛谷 P1078 文化之旅
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...
- C# 处理Word自动生成报告 四、程序处理
C# 处理Word自动生成报告 一.概述 C# 处理Word自动生成报告 二.数据源例子 C# 处理Word自动生成报告 三.设计模板 C# 处理Word自动生成报告 四.程序处理 现在说一下程序处理 ...
- FORTH 安装使用
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...