作者:Chancel Yang, 更新:2019 Mar 26, 字数:6022, 已阅:729
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视为一个封装好指定运行环境的各种虚拟机
国外
国内
例子 - 拉取ubuntu:16.04的image
docker pull registry.docker-cn.com/myname/myrepo:mytag
推荐参考**GitBook -- 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中执行)。
#
···
安装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
使用systemctl status docker查看情况,发现是selinux没有关闭,遂关闭selinux并重启系统
vim /etc/selinux/config
# 修改SELINUX的值为disabled
SELINUX=disabled
# 重启
reboot