一、拉取镜像
- 搜索镜像:docker search centos
- 拉取镜像:docker pull centos
- 推送镜像:
docker login
docker tag new_boxing_image zhangninglei/new_boxing_image(将本地镜像命名为docker用户名/镜像名)
docker push zhangninglei/new_boxing_image
二、构建Docker容器
step1
- 编写Dockerfile文件:
- 指令
FROME 指定基础镜像:FROM <image>[:<tag>] [AS <name>]
RUN 执行命令:①RUN <command>;②RUN ["可执行文件", "参数1", "参数2"]
COPY 复制文件到镜像中:COPY [--chown=<user>:<group>] <src>... <dest>
EXPOSE 对主机暴露端口:EXPOSE 8000(要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。)
CMD 指定docker运行的程序及参数:启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。(em:CMD ["nginx", "-g", "daemon off;"])
ENV 设置环境变量:ENV <key> <value> (em:ENV NODE_VERSION 7.2.0)
WORKDIR 指定工作目录:WORKDIR <工作目录路径>
USER 指定当前用户:
RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]
- 指令
step2
- 执行构建命令:
- $ docker build cont.ext(项目文件夹路径/git仓库地址)
- 默认在当前目录下读取Dockerfile
- -f: 指定Dockerfile的文件地址
- -t: 指定生成的镜像名称
- $ docker build cont.ext(项目文件夹路径/git仓库地址)
三、操作Docker容器
-
运行容器:docker run
(em:docker run -t -i ubuntu:14.04 /bin/bash)
- -t: 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
- -i: 让容器的标准输入保持打开
- -v或者–mount: 挂载主机目录到容器(加载主机的 /src/webapp 目录到容器的 /opt/webapp目录):
-v /src/webapp:/opt/webapp
--mount type=bind,source=/src/webapp,target=/opt/webapp
- -p或-P:
- -P:Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
- -p:可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。
- 格式:
ip:hostPort:containerPort | ip::containerPort |hostPort:containerPort
- 格式:
docker run 来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
- 启动已终止容器
docker container start
- 终止容器
docker container stop
- 进入容器
- `exec: docker exec -it docker_id bash
- 删除容器
docker container rm
- 清理所有处于终止状态的容器
docker container prune
Docker Compose部署分布式
一、下载
- Mac、windows自带docker-compose不需要安装
- Linux下安装:
- 二进制安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
二、使用
- 创建项目:/project/app.py
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
- 编写Dockerfile
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
- 编写模板文件:docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
- 运行compose项目
docker-compose up
三、compose命令
- 格式:docker-compose [-f=…] [options] [COMMAND] [ARGS…]
- -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
- -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
- –x-networking 使用 Docker 的可拔插网络后端特性
- –x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
- –verbose 输出更多调试信息。
- -v, --version 打印版本并退出。
四、完整示例(Django+PostgreSQL)
step1: 配置数据库(django_example/settings.py)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
step2: 编写Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
step3: 编写docker-compose.yml
version: "3"
services:
db:
image: postgres
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
step4: 启动
docker-compose up