ubuntu:latest
, django:1.6
等。 通常是在已有的镜像(多数是Linux操作系统的镜像)的基础上构建自己的、具有新功能的镜像。与传统虚拟机很大的不同在于,一个容器通常只运行一个程序。在Docker中,应用程序和数据文件是分开的,因此可以在不影响数据的情况下快速升级代码或系统。
数据卷存储在运行Docker的宿主机上,对每个容器来说是特有的。 我们可以启动同一个镜像来产生多个容器,并且分别给他们分配一个数据卷。
数据卷也可用于在不同的容器间共享数据。 具体参见http://blog.genesino.com/2016/09/docker-lamp/
假如有个正在运行的数据库容器 (dbapp), 那么我们可以在网络服务器容器 (webserver)中通过指定端口连接dbapp与数据库容器通讯。
#添加epel的源
su -c 'rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm'
yum update
# 安装Docker
yum install docker-io
# 启动Docker服务
service docker start
# 关闭Docker服务
service docker stop
# 设置Docker开机启动
/sbin/chkconfig --add docker
/sbin/chkconfig docker on
yum
或apt
工具, 启动和配置如上。apt-get install docker.io
默认情况下,Docker命令的运行需要root用户权限。一个解决办法是把用户加入docker
用户组,原因是Docker能够将/run/docker.socket
的文件权限设为660
、用户组设为docker
。当把用户加入到docker
用户组后,就无需使用sudo
或su
命令切换获取root用户权限。
###以下操作都是在根用户下进行的
###增加一个用户组docker
# groupadd docker
###把用户${USER}加入docker用户组
# usermod -aG docker ${USER}
###重启docker服务(可不执行)
# service docker restart
###新窗口登录${USER}
但通常只应把信任的用户加入docker用户组,因为docker用户组的权限相当于root。
如果打算只允许用户访问一个特定的容器,可以写一个简单脚本
# cat /bin/docker_container1
#!/bin/sh
docker run -ti --rm container_name /bin/sh
脚本完成后,配置sudoers
# grep username /etc/sudoers
username ALL=(ALL) NOPASSWD: /bin/docker_container1
更多权限设置见http://dockone.io/article/589
root@server:~# docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is ... 4595 [OK]
ubuntu-upstart Upstart is... 66 [OK]
jordi/ubuntu Ubuntu bas... 1 [OK]
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest 37b164bb431e 4 days ago 126.6 MB
docker run --rm ubuntu echo "Hello from docker"
Hello from docker
root@server:~# docker run -it ubuntu
root@57cb695e904f:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@57cb695e904f:/#
build-essential
和r-base
; build-essential 是编译软件包的基础,提供需要的编译器、头文件和库文件。r-base 是编译R语言程序包的基础。apt-get update
#apt-get install -y build-essential r-base
apt-get install toliet
这一步可以安装任意的软件,测试时可以选择小一点的软件包。 为了简单起见, 可以尝试安装Apache
。通过使用端口映射的方式通过主机IP+端口号的方式访问容器的Apache应用。
docker commit -m 'Add build-essential r-base' -a ct5869 8aca49b869be ct5869/ubuntu-dev:v1''
。docker run --rm -it username/ubuntu-dev:v1
-v
参数,路径都为绝对路径,docker run --rm -v /host_absolute_dir:/container_absolute_dir username/ubuntu-dev:v1 echo 'test' >/container_absolute_dir/test_file
这样,就相当于把host机目录/host_absolute_dir
链接为docker容器路径/container_absolute_dir
导出
和导入
来迁移镜像
docker export image_id >ubuntu-dev.v1.tar
cat ubuntu-dev.v1.tar | docker import - username/ubuntu-dev:v1
username
docker login
,按提示输入用户名、密码和邮件。登录成功会返回Login Succeeded
docker push username/ubuntu-dev:v1
把准备好的镜像上传; 等待片刻,完成上传。这时就可以再Docker hub上看到上传的镜像了。docker pull username/ubuntu-dev:v1
来获取安装好编 译环境的ubuntu系统了。docker rm container_id
移除容器,以节省空间。 这不会对镜像造成影响docker rm -v container_id
移除容器及其挂载卷, 以节省空间。这不会对镜像造成影响docker rm -v $(docker ps -a -q -f status=exited)
docker run
时添加--rm
参数就好。这样容器运行结束后会自动删除docker rmi username/ubuntu-dev:v1
移除镜像docker tag 26d99f722dca username/ubuntu-dev:v0
修改镜像的名字docker run -d --name=container_name username/ubuntu-dev:v1
指定运行的container的名字docker run --rm -ti -v /host_abs_dir:/container_abs_dir:ro username/ubuntu-dev:v1
挂载只读目录docker stop containde_id/container_name
停止镜像docker rm $(docker ps -a -q)
和docker rmi $(docker images -q)
移除全部镜像。BE CAREFULLdocker history image_name
IMAGE CREATED CREATED BY SIZE COMMENT
3d4f934accdb 7 months ago /bin/sh -c #(nop) CMD ["/run.sh" ] 0 B
aa321fa8d23f 7 months ago /bin/sh -c #(nop) EXPOSE 3306/tcp 80/tcp 0 B
6446fbfc507d 7 months ago /bin/sh -c #(nop) VOLUME [/etc/mysql /var/lib 0 B
44e98bdf2bbf 7 months ago /bin/sh -c #(nop) ENV PHP_POST_MAX_SIZE=10M 0 B
bedff16caee9 7 months ago /bin/sh -c #(nop) ENV PHP_UPLOAD_MAX_FILESIZE 0 B
72b723ccc97f 7 months ago /bin/sh -c mkdir -p /app && rm -fr /var/www/h 0 B
docker inspect image_name
/var/lib/docker
/var/lib/docker/{driver-name}
will contain the driver specific storage for contents of the images./var/lib/docker/graph/
now only contains metadata about the image, in the json and layersize files.docker logs --tail=all container_id
除了可以像上面那样一步步地获取镜像、修改容器、存储镜像、上传镜像等操作外, 还可以使用Dockerfile自动实现上述操作。
典型的Dockerfile如下所示:
FROM alpine
MAINTAINER username [email protected]
RUN apk add --no-cache apache2 apache2-utils
COPY public_html /var/www/html
EXPOSE 80 443
CMD ["rc-service apache2 start"]
FROM
为除注释之外的第一条命令,用来声明镜像的基础系统。MAINTAINER
设置镜像维护人的信息。RUN
在容器内部运行shell命令。COPY
是把本地的bash配置文件拷贝到新维护的镜像中; COPY的文件的路径是相对于docker build的PATH,一般是当前路径;CMD
指定容易运行时默认执行的命令,如出现多个,只有最后一个会被运行。运行命令docker build -t="username/httpd-alpine:v1" .
就可以构建镜像了。 最后的.
表示Dockerfile在当前目录,也可指定其他目录。public_html
必须 与Dockerfile在同一目录。
原文链接:GitHub: http://blog.genesino.com/2016/07/docker/CSDN: http://blog.csdn.net/qazplm12_3/article/details/73436708