====== docker 快速实践 ======
===== docker 安装 =====
免费版本为docker-ce 即社区版本
* CentOS: https://docs.docker.com/engine/install/centos/
设置docker数据目录:
vi /etc/docker/daemon.json
{
"data-root": "/data/docker"
}
systemctl restart docker
===== Docker 容器与镜像快速一览 =====
docker 讲究的是轻服务,因此通常情况下是一个docker容器跑一个服务,在一个容器中同时运行数据库和应用是基本上不存在的,除非整个服务依赖项都非常轻量
* 使用 docker pull 从docker hub 拉取的软件包被称之为镜像
* 每次使用 docker run IMAGENAME 都会自动以镜像为蓝本生成一个运行空间,这个运行空间被称为容器,每个容器相互隔离
* 查看所有镜像使用 docker image ls -a (( 老版本使用docker images -a )) 命令,而查看所有容器使用 docker ps -a 命令
* 使用exit命令或者按下ctrl-c停止容器后,容器不会消失,需要使用docker rm删除容器,使用docker rm 删除时,仅须提供镜像ID前几位(可以区分不同容器即可)
* 对容器的更改会保留在当前容器中,但不会影响镜像
* 使用 docker commit 会提交容器修改至镜像,相关命令 docker commit container-id image-name:tag
* 使用 docker save image-name:tag -o image.tar 将镜像保存至文件
* 使用 docker load 将镜像文件导入到docker daemon
* docker inspect image-id 显示容器详细信息,如虚拟IP,开放端口等
**容器本质是一个进程,因此在启动容器时的启动命令须是((前台))程序,如果是后台程序,容器检测到主程序退出后,容器也会自动退出,因此针对一些常见的服务,如NGINX,则不能再使用后台运行的方式启动,而只能以前台运行的方式启动,如 nginx -g daemon off **
===== 常用命令 =====
> docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
> docker start $(docker ps -qf 'status=exited')
> 启动所有容器
> docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
> docker stop $(docker ps -qa)
> 停止所有容器
> 注:tail -n +2 代表从第二行开始输出
> 删除已停止的容器
> docker rm $(docker ps -qf 'status=exited')
===== docker 的一些常用参数 =====
> -p local-port:container-port , 端口映射,可绑定多个端口
> -v local-dir:container-dir, 卷挂载,可将本地目录或者创建的docker卷挂载给容器,可挂载多个
> -h hostname, 指定容器主机名
> --name container-name, 容器名
===== 定时运行容器内的任务 =====
==== 在主机系统的Crontab内增加计划任务指令 ====
大概指令格式为:
> */3 * * * * docker exec container-name cmd
==== 在以CentOS为基础的镜像包中安装Crontab ====
> yum install cronie
> crond
==== 在以Ubuntu为基础的容器中安装Crontab ====
> apt-get update
> apt-get install cron
> cron
注意:务须先执行update后再安装,否则会无法找到资源。
===== 实例 =====
==== 启动一个FRESHRSS服务 ====
docker run -d --restart unless-stopped --log-opt max-size=10m \
-v rss-data:/var/www/FreshRSS/data \
-v rss-ext:/var/www/FreshRSS/extensions \
-p 8080:80 \
-e 'CRON_MIN=4,34' \
-e TZ=Asia/Shanghai \
--name rss freshrss/freshrss
==== 启动一个 ElasticSearch 节点 ====
** 拉取镜像 **
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.0
** 启动容器 **
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.15.0
** 测试 **
curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"
===== docker 特性 =====
==== Docker 卷及文件存储 ====
创建docker卷
> docker volume create vol-name
显示docker卷
> docker volume ls
将文件从本地文件系统复制到docker容器
> docker cp local-dir/file container-id:dir
> docker cp containerid:dir local-dir
> 同前面一样,container-id不需要完整id,能够区分每个容器的前几位就可以了
将卷或本地目录挂载给容器
> docker run -it -v vol-name:/data/dir \
> -v vol2:/data/dir2 \
> --name container-name
> image-name cmd
==== Docker 网络端口 ====
> docker run -it -p local-port:container-port \
> -p local-port2:container-port2 \
> --name container-name
> image-name cmd
==== Docker 网络与访问隔离 ====
需要较高版本的docker
==== docker 资源配额 ====
在运行前限制
docker run -m 1024m --memory-swap=1024m \
-c 0.2 --cpuset-cpus='0,1' \
imagename:tag cmd
其中:
* M 限制内存使用为1024M,将内存及交换空间限制为1024M,也就是不使用虚拟内存
* C 限制容器使用CPU权重,最低可使用20%CPU
* CPUSET-CPUS 限制可以运行此容器的CPU编号
==== 共享容器 ====
以下命令创建了一个共享容器,挂载了多个卷或者本地目录
docker create -v local-dir1:container-dir1 \
-v local-dir2:container-dir2 \
-v local-dir3:container-dir3 \
-v .....
--name share-dirs ubuntu:18.04
引用时
docker run --volume-from share-dirs ubuntu:18.04 --name s2
===== dockerfile 及构建 =====
FROM python:3.6-slim
MAINTAINER whx3000
RUN apt-get update && \
apt-get install -y --no-install-recommends \
cron && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean
RUN chmod +x ./docker-entrypoint.sh
ENV LC_ALL C.UTF-8
ENTRYPOINT ["./docker-entrypoint.sh"]
相关说明:
* FROM 基础镜像 -- 从基础镜像构建镜像
* RUN shell命令列表 -- 运行构建命令,每个RUN命令构建一层镜像,因此一个RUN命令运行多个命令避免构建多层镜像,多个命令用两个%% && %% 符号连接
* ENV var-name value -- 传送环境变量
* ENTRYPOINT ['cmd','arg','arg'] --docker启动时运行的命令
* CMD ['arg','arg'] 或 CMD ['cmd','arg','arg'] 或 CMD "cmd arg arg" --如果指定了EntryPoint,后面可以再传参数,如果没有指定EntryPoint,则运行CMD中指定的命令
* COPY ./dir/files* image-dir --将文件上下文目录中的文件复制到镜像,每个COPY构建一层镜像
docker 镜像构建
cd docker-dir
docker build -t image-name:tag .
注:"."代表构建docker上下文目录,dockerfile及需要添加进镜像的文件可以都放在里面
===== Docker 编排 -- Docker Compose =====
docker.yml 配置文件
version: '3'
services:
nginx:
image: nginx
container_name: lnmp-nginx
depends_on:
- php
ports:
- "80:80"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
networks:
- "net1"
php:
image: php
container_name: lnmp-php
expose:
- "9000"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
networks:
net1:
driver: bridge
注意:
* service 节定义需要拉起的容器及各容器初始化参数
* 各节之间同级的内容需要对齐
定义完拉取服务后使用 docker-compose dock.yml up 拉起服务
参考资料:https://yeasy.gitbook.io/docker_practice/