参考文档
① Docker的安装和镜像创建
② Docker的save和export命令的区别
③ 如何在 Fedora 22 上面配置 Apache 的 Docker 容器
一、一个故事
很久以前,有个小小的程序员维护着一台小小的服务器。这个小小的服务器里面运行着一个小小的程序。这个小小的程序有依赖其他很多小小的程序。每当夜幕降临,小小的程序员都担心别人把服务器别人把小小的服务器或者小小的程序依赖的其他小小程序改动了,他那个小小的程序便无法运行了。小小的程序员难以成眠。每次转移、升级,小小的程序员小小的心脏都要蹦出来。
终于,有一天小小的程序员倒下了,灵魂飘忽到一座小小的岛上。小小的岛上住着一个大大的大牛。大大的大牛听说了小小的程序员小小的故事,十分悲伤。大大的大牛开发了docker,并在小小的岛上发着小小的心愿,愿天下程序员不再有悲伤,难过。
二、Docker安装
内核要求3.8+,推荐ubuntu 14.04+。
- ubuntu环境
sudo apt-get install docker docker.io
- fedora环境
sudo dnf install docker
- 权限配置
默认docker是需要root权限运行。对于笔者来说,每次都要输入sudo和用户密码,这是不可以接受的。将用户附加到组docker即可拥有运行权限。添加命令如下:
sudo usermod -a -G docker zhouyixing
三、Docker镜像
- pull方式
sudo docker pull ubuntu:14.04
- 模板方式
模板下载地址
cat ubuntu-14.04-x86-minimal.tar.gz | sudo docker import - ubuntu:14.04
- build方式
Dockerfile模板
FROM scratch
# https://partner-images.canonical.com/core/
ADD ubuntu-trusty-core-cloudimg-amd64-root.tar.gz /
# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/master/contrib/mkimage/debootstrap
RUN echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
\
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
\
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
\
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
\
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
\
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes
# enable the universe
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]
build命令
sudo docker build -f Dockerfile -t desay:14.04.3
成果检查
zhouyixing@vmach ~ % sudo docker images 15-12-28 11:08
[sudo] zhouyixing 的密码:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
opm 14.04 0e30db633767 About an hour ago 520.9 MB
docker.io/ubuntu 14.04 89d5d8e8bafb 2 weeks ago 187.9 MB
四、Docker运行
- 普通方式
sudo docker run -i -t docker.io/ubuntu:14.04 /bin/bash
简单的运行镜像docker.io/ubuntu:14.04,并以bash方式进入命令行。
- 端口映射
sudo docker run -it --rm -p 8080:80 -v ~/Workspace/OPM/opm:/root/opm opm:14.04 /bin/zsh
运行镜像opm:14.04,并将主机的8080映射到容器里面的80端口,将主机的~/Workspace/OPM/opm目录挂载到容器里面的/root/opm,并以zsh方式进入命令行。
- 设备映射
sudo docker run -it --hostname=docker --user=desay --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN desay:14.04.3 /bin/zsh
或者
sudo docker run -it --rm=true --hostname=docker --user=desay --privileged=true --cap-add SYS_ADMIN -v ~/openwrt:/home/desay/openwrt -v ~/packages:/home/desay/openwrt/dl -w /home/desay/openwrt desay:14.04.3 /bin/bash
对于deepin 2015系统,需要手动创建loop节点。命令如下
sudo mknod /dev/loop0 b 7
更多运行方式可以docker --help
以及docker run --help
查询。
五、镜像提交
镜像运行的过程中,可以通过sudo docker ps -a
命令确定CONTAINER ID。通过以下命令提交。
sudo docker commit <CONTAINER ID> > tag:commit
提交后可以通过sudo docker images
会看到新提交的images
六、镜像保留
- 导出模板
通过sudo docker ps -a
命令确定CONTAINER ID。通过以下命令导出。
sudo docker export <CONTAINER ID> > ~/export.tar.gz
- 镜像保存
sudo docker save <REPOSITORY> > /home/save.tar
七、其他应用
- tomcat
# 安装
docker pull tomcat
# 运行
docker run -p 8080:8080 -v tomcat:latest
# 其他
# 对于笔者来说,笔者仅仅想要一个web server。
# ${WEB_APP_PATH}为web存放路径,首页命名为index.html(或者index.jsp)即可。
# 浏览器登陆http://localhost:8080/可验证
docker run -p 8080:8080 -v ${WEB-APP}:/usr/local/tomcat/webapps/ROOT tomcat:latest
- gogs
# 安装
docker pull gogs/gogs
# 建立gogs目录
sudo mkdir /gogs
# 运行
# 注意到/gogs的权限是root。对于笔者来说,git服务器需要开机即运行。所以笔者不会有权限问题。
# 将以下命令添加到/etc/profile文件即可。
# 10080为网页访问端口。10022为ssh clone端口。
docker run --rm=true -p 10022:22 -p 10080:3000 -v /gogs:/data gogs/gogs