这是本文档旧的修订版!
docker 快速实践
docker 安装
免费版本为docker-ce 即社区版本
Docker 容器与镜像快速一览
docker 讲究的是轻服务,因此通常情况下是一个docker容器跑一个服务,在一个容器中同时运行数据库和应用是基本上不存在的,除非整个服务依赖项都非常轻量
- 使用 docker pull 从docker hub 拉取的软件包被称之为镜像
- 每次使用 docker run IMAGENAME 都会自动以镜像为蓝本生成一个运行空间,这个运行空间被称为容器,每个容器相互隔离
- 查看所有镜像使用 docker image ls -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 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
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 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 编排 -- 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 拉起服务