目录

docker 快速实践

docker 安装

免费版本为docker-ce 即社区版本

设置docker数据目录:

vi /etc/docker/daemon.json
{
  "data-root": "/data/docker"
}
systemctl restart docker

Docker 容器与镜像快速一览

docker 讲究的是轻服务,因此通常情况下是一个docker容器跑一个服务,在一个容器中同时运行数据库和应用是基本上不存在的,除非整个服务依赖项都非常轻量

容器本质是一个进程,因此在启动容器时的启动命令须是((前台))程序,如果是后台程序,容器检测到主程序退出后,容器也会自动退出,因此针对一些常见的服务,如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

其中:

共享容器

以下命令创建了一个共享容器,挂载了多个卷或者本地目录

  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 <[email protected]>
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"]

相关说明:

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

注意:

定义完拉取服务后使用 docker-compose dock.yml up 拉起服务

参考资料:https://yeasy.gitbook.io/docker_practice/

1)
老版本使用docker images -a