Docker快速入门
Docker Wiki
Docker是一个开放源代码软件项目,让应用程序部署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制[1]。
Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免引导一个虚拟机造成的额外负担[2]。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施。
简言之,可以把Docker视为一个封装好指定运行环境的各种虚拟机
优缺点
- 优点
- 部署方便
- 省去环境搭建
- 部署安全
- 高度统一的环境
- 隔离性好
- 多个软件版本互不干扰
- 快速回滚
- 类似虚拟机的镜像回滚
- 部署成本低
- 相比虚拟机占用许多资源/宿主机部署环境等购置成本,docker拥有天然的优势(复制->运行)
- 管理成本低
- 学习成本越来越低
- 多平台适应
- Windows、Mac、Linux均支持Docker方案
- 缺点
- 隔离性不够稳定
- 与虚拟机相比,docker并非完全虚拟
- 性能
- 性能有所损耗是必然的
- 存储方案
- docker的数据持久化会造成部分资源的浪费
- 前期可能存在数据丢失
- 数据持久化的设置比较复杂
了解Docker
- Docker的核心点
- 标准化
- 集装箱
- 隔离
核心镜像
仓库
容器
镜像、仓库、容器
- 镜像
- 相当于集装箱,封装了应用以及应用环境,做到拉取镜像运行镜像应用即可启动
- 仓库
- 相当于码头,码头上有很多集装箱提供给宿主机随时拉取 ,可以构建属于自己的私有码头
- 容器
- 相当于工厂,使用集装箱里的东西进行加工输出
Docker仓库地址
- 部署方便
- 省去环境搭建
- 部署安全
- 高度统一的环境
- 隔离性好
- 多个软件版本互不干扰
- 快速回滚
- 类似虚拟机的镜像回滚
- 部署成本低
- 相比虚拟机占用许多资源/宿主机部署环境等购置成本,docker拥有天然的优势(复制->运行)
- 管理成本低
- 学习成本越来越低
- 多平台适应
- Windows、Mac、Linux均支持Docker方案
- 隔离性不够稳定
- 与虚拟机相比,docker并非完全虚拟
- 性能
- 性能有所损耗是必然的
- 存储方案
- docker的数据持久化会造成部分资源的浪费
- 前期可能存在数据丢失
- 数据持久化的设置比较复杂
- Docker的核心点
- 标准化
- 集装箱
- 隔离
核心镜像
仓库
容器
镜像、仓库、容器
- 相当于集装箱,封装了应用以及应用环境,做到拉取镜像运行镜像应用即可启动
- 相当于码头,码头上有很多集装箱提供给宿主机随时拉取 ,可以构建属于自己的私有码头
- 相当于工厂,使用集装箱里的东西进行加工输出
国外
国内
例子 - 拉取ubuntu:16.04的image
docker pull registry.docker-cn.com/myname/myrepo:mytag
应用场景
- 持续交付的服务
- 数据不太重要的服务
常见指令
- 从仓库拉取镜像:docker pull [your_image_name]
- 查看本机镜像:docker images
- 运行镜像:docker run [your_image_name]
- 后台运行镜像:docker run -d [your_image_name]
- 查看本机正在运行的容器:docker ps
- 进入容器:docker exec -it [id] bash
- 停止容器:docker stop id
- 重启容器:docker restart id
- 删除镜像:docker rmi id
- 帮助指令:docker run --help
Docker文档
- 从仓库拉取镜像:docker pull [your_image_name]
- 查看本机镜像:docker images
- 运行镜像:docker run [your_image_name]
- 后台运行镜像:docker run -d [your_image_name]
- 查看本机正在运行的容器:docker ps
- 进入容器:docker exec -it [id] bash
- 停止容器:docker stop id
- 重启容器:docker restart id
- 删除镜像:docker rmi id
- 帮助指令:docker run --help
Docker文档
推荐参考**GitBook -- Docker从入门到实践 **系列文档,放在文末的资料引用中。
Docker镜像创建
DockerFile - Docker镜像的配置文件,可下面的配置文件说明
# docker官方镜像仓库
# 指定docker官方仓库的最新版nodejs镜像作为基础镜像
From node:latest
# 第三方镜像仓库,比如阿里云的 “https://dev.aliyun.com/search.html ”
# 指定标签为7.5的"registry.cn-hangzhou.aliyuncs.com/sessionboy/node"镜像作为基础镜像
From registry.cn-hangzhou.aliyuncs.com/sessionboy/node:7.5
# MAINTAINER - 作者信息
MAINTAINER sessionboy <postmaster@boyagirl.com>
# 镜像操作
···
# 复制文件/目录到某个目录下
COPY [source_path] [target_path]
# 拷贝文件/目录到某个目录下(如果是压缩包,会自动解压)
ADD [source_dir] [target_dir]
# 接收参数并创建镜像
RUN [args]
# 指定运行容器的UID
USER 123456
# 持久化数据
VOLUME ["/data","/home"]
# 环境变量(例如设置NODE_ENV为production
ENV NODE_ENV production
# 指定对外暴露端口
EXPOSE 8000
···
# 容器启动时执行的指令
···
# 制定启动容器时执行命令的三种方式
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
# 容器启动后执行的命令的两种方式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)。
#
···
例子 - 在Cent7OS下制作开源笔记leanote的docker镜像安装Docker-Compose
安装Python-pip
# 检查是否安装了Python-pip
pip -V
# 安装Python-pip并升级
yum -y install epel-release
yum -y install python-pip
更改Python-pip源至国内源
mkdir ~/.pip/
vim ~/.pip/pip.conf
# 输入以下内容并保存
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
# 升级pip
pip install --upgrade pip
安装Docker-Compose
# 安装Docker-Compose
pip install docker-compose --ignore-installed requests
# 检查Docker-Compose版本
docker-compose -version
安装并启动docker
yum -y install docker
systemctl start docker
制作DockerFile
DockerFile - Docker镜像的配置文件,可下面的配置文件说明
# docker官方镜像仓库
# 指定docker官方仓库的最新版nodejs镜像作为基础镜像
From node:latest
# 第三方镜像仓库,比如阿里云的 “https://dev.aliyun.com/search.html ”
# 指定标签为7.5的"registry.cn-hangzhou.aliyuncs.com/sessionboy/node"镜像作为基础镜像
From registry.cn-hangzhou.aliyuncs.com/sessionboy/node:7.5
# MAINTAINER - 作者信息
MAINTAINER sessionboy <postmaster@boyagirl.com>
# 镜像操作
···
# 复制文件/目录到某个目录下
COPY [source_path] [target_path]
# 拷贝文件/目录到某个目录下(如果是压缩包,会自动解压)
ADD [source_dir] [target_dir]
# 接收参数并创建镜像
RUN [args]
# 指定运行容器的UID
USER 123456
# 持久化数据
VOLUME ["/data","/home"]
# 环境变量(例如设置NODE_ENV为production
ENV NODE_ENV production
# 指定对外暴露端口
EXPOSE 8000
···
# 容器启动时执行的指令
···
# 制定启动容器时执行命令的三种方式
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
# 容器启动后执行的命令的两种方式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)。
#
···
安装Docker-Compose
安装Python-pip
# 检查是否安装了Python-pip
pip -V
# 安装Python-pip并升级
yum -y install epel-release
yum -y install python-pip
更改Python-pip源至国内源
mkdir ~/.pip/
vim ~/.pip/pip.conf
# 输入以下内容并保存
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
# 升级pip
pip install --upgrade pip
安装Docker-Compose
# 安装Docker-Compose
pip install docker-compose --ignore-installed requests
# 检查Docker-Compose版本
docker-compose -version
安装并启动docker
yum -y install docker
systemctl start docker
创建DockerFile文件/home/chancel/leanote-docker/Dockerfile
FROM alpine:edge ARG LEANOTE_VERSION=2.3 RUN apk add --no-cache --update wget ca-certificates \ && wget https://jaist.dl.sourceforge.net/project/leanote-bin/${LEANOTE_VERSION}/leanote-linux-amd64-v${LEANOTE_VERSION}.bin.tar.gz \ && tar -zxf leanote-linux-amd64-v${LEANOTE_VERSION}.bin.tar.gz -C / \ && rm -rf /leanote/mongodb_backup \ && rm leanote-linux-amd64-v${LEANOTE_VERSION}.bin.tar.gz \ && apk del --purge wget VOLUME /leanote/public/upload EXPOSE 9000 CMD ["/leanote/bin/run.sh"]
创建initdb.sh文件/home/chancel/leanote-docker/initdb.sh
#! bin/sh apk add --no-cache wget wget https://jaist.dl.sourceforge.net/project/leanote-bin/2.3/leanote-linux-amd64-v2.3.bin.tar.gz tar zxf leanote-linux-amd64-v2.3.bin.tar.gz mv leanote/mongodb_backup / mongorestore -h mongo -d leanote --dir /mongodb_backup/leanote_install_data/
创建docker-compose.yml文件/home/chancel/leanote-docker/docker-compose.yml
version: '2' services: leanote: image: chancel/leanote ports: - "9000:9000" volumes: - ./app.conf:/leanote/conf/app.conf - ./upload:/leanote/public/upload - /etc/localtime:/etc/localtime:ro links: - mongo mongo: image: mvertes/alpine-mongo volumes: - ./data:/data/db initdb: image: mvertes/alpine-mongo links: - mongo volumes: - ./initdb.sh:/initdb.sh - ./data:/data/db command: sh /initdb.sh
执行创建命令
docker build -t chancel/leanote . docker-compose run initdb docker-compose up leanote mongo
遇到一些问题Docker启动失败?
使用systemctl status docker
查看情况,发现是selinux没有关闭,遂关闭selinux并重启系统
vim /etc/selinux/config
# 修改SELINUX的值为disabled
SELINUX=disabled
# 重启
reboot