docker学习笔记
2019-07-07 本文已影响0人
右左君
docker学习笔记
[TOC]
相关概念
需求
- 环境配置麻烦的问题
- 虚拟机:资源占用多、冗余步骤多、启动慢(虚拟机是完整的操作系统)
linux 容器
Linux 容器(Linux Containers,缩写为 LXC)不是模拟一个完整的操作系统,而是对进程进行隔离。
优势:进程级别,资源占用低,体积小,启动快,多个容器可以共享资源。
Docker
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。
Docker 通过将程序及程序依赖包or文件打包成一个文件,即为image文件。运行image文件,生成一个容器(底层系统的一个进程)。
每个容器之间相互隔离(内存空间、硬盘空间、线程、网络地址等等),共用部分系统资源。
image 文件
- 二进制文件,包含程序代码及其依赖
- 通用,可以看做是容器的模板
- 同一个image可以生成多个容器且同时运行
container 文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。
一旦容器生成,会生成容器文件,且容器文件不会随容器停止而删除。
Dockerfile 文件
Dockerfile文件,用来配置image,docker根据Dockerfile创建image文件。
编写Dockerfile文件
以python web项目为例
1.根目录创建 .dockerignore文件
表示打包成image时忽略的文件或者文件夹
.git
*.log
2.生成python依赖包文件requirements.txt
pipenv lock --requirements > requirements.txt
bottle==0.12.16
urllib3==1.23
3.编写Dockerfile文件
# python 环境 alpine版本为体积最小版本
FROM python:3.7-alpine
# 将工作目录设置为 /web
WORKDIR /web
# 将当前目录内容复制到位于 /web 中的容器中
ADD . /web
# 按照 依赖环境到临时的虚拟包
# 安装 requirements.txt 中指定的任何所需软件包
# 删除缓存文件和虚拟包
RUN apk add --no-cache --virtual .pynacl_deps build-base python3-dev libffi-dev \
&& pip install -r requirements.txt \
&& rm -rf .cache/pip \
&& apk del .pynacl_deps
# 定义环境变量
ENV profile=test
# 定义语言环境
ENV LANG=en_US.UTF-8
#将容器 8080 端口暴露出来, 允许外部连接这个端口。
EXPOSE 8080
# 在容器启动时运行 web.py
CMD ["python3", "web.py"]
4.生成docker image文件
# docker image build -t <image_name>:<image_version> <Dockerfile 所在文件夹名称>
docker image build -t web .
5.运行container
# test 环境
docker container run --env profile=test --rm -p 8080:8080 -it web
# prod 环境
docker container run --env profile=prod --rm -p 8080:8080 -it web
6.发布image 文件
# 先登录
docker login
# 为本地image 标注用户名和版本。
docker image tag [imageName] [username]/[repository]:[tag]
# 实例
docker image tag web:latest xxx/web:latest
docker image push xxx/web:latest
6. 获取image
# 先登录
docker login
# 后pull
docker pull xxx/web:latest