androidapachebackendcentoscentos8.4commandcomposercrontabcurldesigndevelopdockerelasticfinancingfirewallfrontendgatewaygitgolanghybridiisiptablesjavajenkinskuberneteslaravelluamacmemcachemigrationmongodbmysqlnginxnodejsofficeopenrestyopensslperformancephpproductionredisregexprestfulsecurityshadowsocksshellsnippetsshstartupteamtraintravelunitvmwarevsftpwindowsworkwwwyaf

Docker

Docker 安装

# 使用 YUM 安装
yum update
yum install docker

# 启动
systemctl start docker

# 测试
docker run hello-world

常用命令

生命周期管理

# 创建一个新的容器并运行一个命令
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -i -t ubuntu:14.04 /bin/bash

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID; 
-i: 以交互模式运行容器,通常与 -t 同时使用;  
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; 
--name="nginx-lb": 为容器指定一个名称;   
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;   
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;  
-h "mars": 指定容器的hostname;   
-e username="ritchie": 设置环境变量;  
--env-file=[]: 从指定文件读入环境变量; 
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;   
-m :设置容器使用内存最大值;    
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;    
--link=[]: 添加链接到另一个容器;  
--expose=[]: 开放一个端口或一组端口;

# 启动/停止/重启容器
docker start/stop/restart

# 杀掉一个运行中的容器
docker kill

# 删除一个或多少容器
docker rm

# 暂停/恢复容器中所有的进程
docker pause/unpause

# 创建一个新的容器但不启动它
docker create

# 在运行的容器中执行命令
docker exec
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端

容器操作

# 在运行的容器中执行命令
docker ps

# 获取容器/镜像的元数据
docker inspect

# 查看容器中运行的进程信息,支持 ps 命令参数
docker top

# 连接到正在运行中的容器
docker attach

# 从服务器获取实时事件
docker events

# 获取容器的日志
docker logs

# 阻塞运行直到容器停止,然后打印出它的退出代码
docker wait

# 将文件系统作为一个 tar 归档文件导出到 STDOUT
docker export

# 列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口
docker port

容器rootfs命令

# 从容器创建一个新的镜像
docker commit

# 用于容器与主机之间的数据拷贝
docker cp

# 检查容器里文件结构的更改
docker diff

镜像仓库

# 登陆到一个 Docker 镜像仓库
docker login

# 从镜像仓库中拉取或者更新指定镜像
docker pull ubuntu

# 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push

# 从 Docker Hub 查找镜像
docker search ubuntu

本地镜像管理

# 查看镜像
docker images

# 删除本地一个或多少镜像
docker rmi

# 标记本地镜像,将其归入某一仓库
docker tag

# 使用 Docker file 创建镜像
docker build

# 查看指定镜像的创建历史
docker history

# 将指定镜像保存成 tar 归档文件
docker save

# 从归档文件中创建镜像
docker import

Docker 状态

# 查看版本
docker version

# 显示 Docker 系统信息
docker info

查看当前运行的容器

docker ps
docker ps -a

实例操作

Node.js 项目

本地文件

cd /disk/app

Dockerfile

# 指定我们的基础镜像是 node
FROM node

# 指定制作我们的镜像的联系人信息(镜像创建者)
MAINTAINER admin@veryide.com

# 将根目录下的文件都 copy 到 container(运行此镜像的容器)文件系统的app文件夹下
ADD . /app/

# cd 到 app 文件夹下
WORKDIR /app

# 把当前目录下的所有文件拷贝到镜像中
COPY . /app

# 安装项目依赖包
RUN npm install

# 容器对外暴露的端口号
EXPOSE 4500

# 容器启动时执行的命令,类似 npm run start
CMD ["npm", "start"]

在当前目录创建镜像

docker build -t segment .

运行容器

docker run -d -p 8888:4500 segment

上传镜像

# 登录 Docker Hub
docker login

# 镜像打上tag,namespace 可以指定为你的 Docker Id
docker tag segment:1.0 mopland/segment:1.0

# 将镜像上传至 docker 的公共仓库
docker push mopland/segment:1.0

# 退出登录
docker logout

下载镜像

docker pull mopland/segment:1.0

Nginx + PHP 实例

Dockerfile

FROM centos:latest

MAINTAINER admin@veryide.com
ENV TIME_ZOME Asia/Shanghai

# 安装必要软件
RUN yum install nginx -y
RUN yum install php php-fpm php-xml php-curl -y
RUN yum install git -y

# 复制配置文件
COPY fastcgi_params /etc/nginx/
COPY phpcgi.conf /etc/nginx/default.d/phpcgi.conf

# 更新配置文件
RUN mkdir -p /run/php-fpm
RUN sed -i 's@;date.timezone =@date.timezone = Asia/Shanghai@g' /etc/php.ini

# 从仓库拉代码
ARG CACHEBUST=1
RUN mkdir /www && cd /www && git clone https://github.com/TouloMin/abc.git --depth 1 "./"
RUN mv /www/* /usr/share/nginx/html

EXPOSE 80
CMD php-fpm && nginx -g "daemon off;"

kingcat.sh

#!/bin/sh
docker build -t kingcat . --build-arg CACHEBUST=$(date +%s)
systemctl restart docker
docker run -it -d -p 8888:80 kingcat

推送至 hub

docker tag kingcat:v1 mopland/kingcat
docker pull mopland/kingcat

常见错误

Error response from daemon: driver failed programming external connectivity on endpoint

systemctl restart docker

清理 none docker 镜像

docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")

清理已经停止运行的 docker 容器

docker rm $(docker ps --all -q -f status=exited)

相关链接