如何交互式地创建一个docker 创建镜像镜像

docker操作运行一步一步来
时间: 16:03:22
&&&& 阅读:4125
&&&& 评论:
&&&& 收藏:0
标签:环境:CentOS 6.5 64位&& &Docker —— 从入门到实践&Docker终极指南 docker安装
#&yum&install&docker-io&&最新为1.5的版本如果没有安源,先安装 #&service&docker&restart
#&ps&aux|grep&docker&|grep&-v&grep
root&&&&&&&&2.0&40&pts/0&&&&Sl&&&17:17&&&0:00&/usr/bin/docker&-d
#&docker&--help&&#查看docker的命令
#&docker&info
#&docker&version
Client&version:&1.5.0
Client&API&version:&1.17
Go&version&(client):&go1.3.3
Git&commit&(client):&a8a31ef/1.5.0
OS/Arch&(client):&linux/amd64
Server&version:&1.5.0
Server&API&version:&1.17
Go&version&(server):&go1.3.3
Git&commit&(server):&a8a31ef/1.5.0安装一个centos容器#&docker&search&ubuntu&&&&&&&&&&&&&&&&&&&#搜索ubuntu镜像
[root@manager&~]#&docker&search&centos&&&#搜索centos镜像
NAME&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DESCRIPTION&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&STARS&&&&&OFFICIAL&&&AUTOMATED
centos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&The&official&build&of&CentOS.&&&&&&&&&&&&&&&&&&&1024&&&&&&[OK]&&&&&&&
ansible/centos7-ansible&&&&&&&&&&&&&&Ansible&on&Centos7&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&42&&&&&&&&&&&&&&&&&&&[OK]
tutum/centos&&&&&&&&&&&&&&&&&&&&&&&&&Centos&image&with&SSH&access.&For&the&root...&&&13&&&&&&&&&&&&&&&&&&&[OK]
blalor/centos&&&&&&&&&&&&&&&&&&&&&&&&Bare-bones&base&CentOS&6.5&image&&&&&&&&&&&&&&&&9&&&&&&&&&&&&&&&&&&&&[OK]
[root@manager&~]#&docker&pull&tutum/centos&&#拉取一个docker镜像到本地
Pulling&repository&tutum/centos
8daafe0f270b:&Download&complete&
6941bfcbbfca:&Download&complete&
:&Download&complete&
fd44297e2ddb:&Download&complete&
e22c88592c50:&Download&complete&
ffce:&Download&complete&
5f:&Download&complete&
77ad887d94d4:&Download&complete&
009a97f615dc:&Download&complete&
1d9e8ea240cb:&Download&complete&
1f:&Download&complete&
Status:&Downloaded&newer&image&for&tutum/centos:latest
[root@manager&~]#&docker&images&&&&&&&&&&#查看镜像,这样就可以了
REPOSITORY&&&&&&&&&&&&&TAG&&&&&&&&&&&&&&&&&IMAGE&ID&&&&&&&&&&&&CREATED&&&&&&&&&&&&&VIRTUAL&SIZE
tutum/centos&&&&&&&&&&&latest&&&&&&&&&&&&&&8daafe0f270b&&&&&&&&13&days&ago&&&&&&&&&292.2&MB下面说docker容器的运行,ssh登录进去[root@manager&~]#&docker&run&-it&tutum/centos&/bin/bash&&#开始运行一个docker
[root@4c7fb1a01e9a&/]#&ls&&&&&&&&&&&&&#根目录下有个run.sh,是开启ssh服务的
bin&&etc&&&lib&&&&lost+found&&mnt&&proc&&run&&&&&sbin&&&&&&&&&&&&srv&&tmp&&var
dev&&home&&lib64&&media&&&&&&&opt&&root&&run.sh&&set_root_pw.sh&&sys&&usr
[root@81b&/]#&cat&run.sh&
#!/bin/bash
if&[&"${AUTHORIZED_KEYS}"&!=&"**None**"&];&then
&&&&echo&"=&&Found&authorized&keys"
&&&&mkdir&-p&/root/.ssh
&&&&chmod&700&/root/.ssh
&&&&touch&/root/.ssh/authorized_keys
&&&&chmod&600&/root/.ssh/authorized_keys
&&&&IFS=$‘\n‘
&&&&arr=$(echo&${AUTHORIZED_KEYS}&|&tr&","&"\n")
&&&&for&x&in&$arr
&&&&&&&&x=$(echo&$x&|sed&-e&‘s/^&*//‘&-e&‘s/&*$//‘)
&&&&&&&&cat&/root/.ssh/authorized_keys&|&grep&"$x"&&/dev/null&2&&1
&&&&&&&&if&[&$?&-ne&0&];&then
&&&&&&&&&&&&echo&"=&&Adding&public&key&to&/root/.ssh/authorized_keys:&$x"
&&&&&&&&&&&&echo&"$x"&&&&/root/.ssh/authorized_keys
&&&&&&&&fi
if&[&!&-f&/.root_pw_set&];&then
&&&&/set_root_pw.sh
exec&/usr/sbin/sshd&-D
[root@81b&/]#&cat&set_root_pw.sh&
#!/bin/bash
if&[&-f&/.root_pw_set&];&then
&&&&echo&"Root&password&already&set!"
&&&&exit&0
PASS=${ROOT_PASS:-$(pwgen&-s&12&1)}
_word=$(&[&${ROOT_PASS}&]&&&&echo&"preset"&||&echo&"random"&)
echo&"=&&Setting&a&${_word}&password&to&the&root&user"
echo&"root:$PASS"&|&chpasswd
echo&"=&&Done!"
touch&/.root_pw_set
echo&"========================================================================"
echo&"You&can&now&connect&to&this&CentOS&container&via&SSH&using:"
echo&"&&&&ssh&-p&&port&&root@&host&"
echo&"and&enter&the&root&password&‘$PASS‘&when&prompted"
echo&"Please&remember&to&change&the&above&password&as&soon&as&possible!"
echo&"========================================================================"
#需要对ssh配置做如下改动&
[root@87d9ae33bd8b&/]#&sed&-ri&‘s/UsePAM&yes/#UsePAM&yes/g‘&/etc/ssh/sshd_config
[root@87d9ae33bd8b&/]#&sed&-ri&‘s/#UsePAM&no/UsePAM&no/g‘&/etc/ssh/sshd_config
#先不要退出#这时候需要新开或复制一下这个ssh,进行下面操作:[root@manager&~]#&docker&ps
CONTAINER&ID&&&&&&&&IMAGE&&&&&&&&&&&&&&&&&COMMAND&&&&&&&&&&&&&CREATED&&&&&&&&&&&&&&STATUS&&&&&&&&&&&&&&PORTS&&&&&&&&&&&&&&&NAMES
87d9ae33bd8b&&&&&&&
&tutum/centos:latest&&&"/bin/bash"&&&&&&&&&About&a&minute&ago&&&Up&About
&a&minute&&&22/tcp&&&&&&&&&&&&&&elegant_hodgkin&&&&&
&[root@manager&~]#&docker&commit&87d9ae33bd8b&new_centos
aafaed68ebade1b6f062a18fe00733a10afa
[root@manager&~]#&docker&images
REPOSITORY&&&&&&&&&&&&&TAG&&&&&&&&&&&&&&&&&IMAGE&ID&&&&&&&&&&&&CREATED&&&&&&&&&&&&&VIRTUAL&SIZE
new_centos&&&&&&&&&&&&&latest&&&&&&&&&&&&&&aaf&&&&&&&&6&seconds&ago&&&&&&&292.2&MB
[root@manager&~]#&docker&run&-d&-p&0.0.0.0:2222:22&new_centos&/run.sh
fcbb8d95cbe63d70c0daa1dc81d0bce9ebd304b731e20aef77cb0ff
[root@manager&~]#&docker&ps
CONTAINER&ID&&&&&&&&IMAGE&&&&&&&&&&&&&&&COMMAND&&&&&&&&&&&&&CREATED&&&&&&&&&&&&&STATUS&&&&&&&&&&&&&&PORTS&&&&&&&&&&&&&&&&&&NAMES
fcb&&&&&&&
&new_centos:latest&&&"/run.sh"&&&&&&&&&&&3&seconds&ago&&&&&&&Up&1&
seconds&&&&&&&&0.0.0.0:2222-&22/tcp&&&reverent_jang&&&&&&&
[root@manager&~]#&docker&logs&fcb&2&&1&|grep&‘^and&enter‘
and&enter&the&root&password&‘I2ihX1Fj4Aq2‘&when&prompted
[root@manager&~]#&ssh&-p&2222&root@localhost
root@localhost‘s&password:&&&&&&&&&&&&&#密码即是上面写的‘I2ihX1Fj4Aq2‘
[root@fcb&~]#&ls&/
bin&&etc&&&lib&&&&lost+found&&mnt&&proc&&run&&&&&sbin&&&&&&&&&&&&srv&&tmp&&var
dev&&home&&lib64&&media&&&&&&&opt&&root&&run.sh&&set_root_pw.sh&&sys&&usr为什么会有些麻烦? 原因在于如果你是Ubuntu的系统,直接就可以使用了;然而centos的系统需要在ssh配置里面把“UsePAM yes”禁用才可以ssh登录,刚开始一直卡到这里:[root@manager ~]# ssh -p 2222 root@localhostroot@localhost‘s password: Connection to localhost closed.&也可以先下载centos的,这样就不会出现问题:#&wget&/tutumcloud/tutum-centos/archive/master.zip
#&unzip&tutum-centos-master.zip
#&cd&tutum-centos-master
#&docker&build&-t&tutum/centos:centos6&centos6& &#给docker的内存设置为最大100M,cpu使用率不超过50%,本地40000端口映射到docker的22端口
[root@manager&~]#&docker&run&-m&100m&-c&512&-d&-p&40000:22&new_centos&/run.sh&
566da8aadfc39e94cf826abec76dcf4e7d1
[root@manager&~]#&docker&ps&&&&&#查看运行的docker&&&CONTAINER&ID&&&&&&&&IMAGE&&&&&&&&&&&&&&&COMMAND&&&&&&&&&&&&&CREATED&&&&&&&&&&&&&STATUS&&&&&&&&&&&&&&PORTS&&&&&&&&&&&&&&&NAMESe10324ba99ca&&&&&&&
&centos:centos6&&&&&&"/bin/bash"&&&&&&&&&38&minutes&ago&&&&&&Up&38&
minutes&&&&&&&&&&&&&&&&&&&&&&&&&&&elegant_lalande&docker容器安装nginxssh进入容器后,安装一个nginx#&yum&install&nginx&-y
#&/usr/sbin/nginx
#&ps&aux|grep&nginx
root&&&&&&&154&&0.0&&0.2&36&?&&&&&&&&Ss&&&03:28&&&0:00&nginx:&master&process&/usr/sbin/nginx
nginx&&&&&&155&&0.0&&0.3&00&?&&&&&&&&S&&&&03:28&&&0:00&nginx:&worker&process到这里,大家应该就明白以后怎么继续做了,具体怎么配置docker的容器,生成自己定制的一套环境,大家各自大显身手,这篇是希望通过这些步骤明白docker具体的操作方法&tutum/centos&这个镜像也可以这么玩,先设定密码或者私钥:docker run -d -p 0.0.0.0:2222:22 -e ROOT_PASS="mypass" tutum/centos& docker run -d -p 2222:22 -e AUTHORIZED_KEYS="`cat ~/.ssh/id_rsa.pub`" tutum/centosdocker的常用命令#&docker&pull&&镜像名:tag&&&&&&&&&&&&&&&&#拉取一个镜像
#&docker&images&&&&&&&&&&&&&&&&&&&&&&&&&&#查看images
#&docker&run&-i&-t&image_name&/bin/bash&&#交互式进入容器
#&docker&ps&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#查看运行的docker&
#&docker&logs&&镜像名:tag&&&&&&&&&&&&&&&&#查看容器的logs
#&docker&start/stop/kill&&镜像名:tag&&&&&
#&docker&rm&$(docker&ps&-a&-q)&&&&&&&&&&&#删除所有容器
#&docker&rmi&$(docker&images&|&grep&none&|&awk&‘{print&$3}‘&|&sort&-r)&#删除所有镜像
#&docker&build&-t&&镜像名&&&Dockerfile路径&&&#构建自己的镜像
#&docker&cp&fcb:/run.sh&.&&&&&&&#从docker复制一个文件到当前目录
#&docker&save&new_centos:latest&&&net_centos.tar&&#保存镜像
#&docker&load&&&net_centos.tar&&&&&&&&&&&#载入镜像
#&docker&run&--help&&&&&&&&&&&&&&&&&&&&&&#更多的命令自己查看一下,相当丰富& 更精彩的docker教程,在 PHP沙盒基于docker的自动化实现本文出自 “” 博客,请务必保留此出处标签:原文:http://bbotte./5588
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!本文原创,原文地址为:
创建镜像的目的
首先说DockerHub或其它一些镜像仓库已经提供了够多的镜像,有最小版本,也有一些安装了mysql、nginx、apache等等第三方软件的版本可以直接拿来使用。虽然已经足够多了,但是有些情况下并不能满足我们的需求,例如需要安装一些比较少用到的第三方软件,这个时候只能先用公共仓库中的镜像,启动容器,然后在容器中按照我们的需求安装软件,修改配置等等操作,之后提交镜像。这些操作在之前的中介绍了。这样操作完成之后,可以用如下两种方式实现定制镜像的目的:
1.用save和export的方式将镜像保存为tar包,然后在需要的时候导入tar镜像包
2.将已经配置好的镜像push到我们的私有仓库()或者已注册过的共有仓库中,需要的时候直接pull下来使用
这两种方式都可以,但是自动化程度低、自由度不够、定制起来比较麻烦。既然如此,那就来说一下更加自动化的创建方式。
Dockerfile结构
dockerfile由4部分信息组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# Base image to use, this must be set as the first line
FROM ubuntu
# Maintainer: docker_user &docker_user & (@docker_user)
MAINTAINER docker_user docker_
# Commands to update the image
RUN echo "deb /ubuntu/ raring main universe" && /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\" && /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /usr/sbin/nginx
其中#表注释,可以标注一些说明性的文字。
FROM关键字指定镜像的来源,默认为DockerHub,也可以写私有仓库的镜像,例如:localhost:5000/centos:6.7,如果本地已经存在指定的镜像名称,则会从本地缓存直接获取。MAINTAINER 指定镜像的作者,之后为镜像操作执行RUN、ADD等,最后是容器启动时发起的指令。
Dockerfile中的指令
FROM: 指定镜像名称,格式为FROM &image& 或FROM &image&:&tag&,例如FROM ubuntu 或 FROM ubuntu:12.04 
MAINTAINER: 镜像作者 ,格式为&MAINTAINER &name&
RUN:格式为&RUN &command&&或&RUN ["executable", "param1", "param2"]。
前者将在 shell 终端中运行命令,即&/bin/sh -c;后者则使用&exec&执行。指定使用其它终端可以通过第二种方式实现,例如&RUN ["/bin/bash", "-c", "echo hello"]。
每条&RUN&指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用&\&来换行。
CMD:支持三种格式
  1.CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;  2.CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;  3.CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
EXPOSE:格式为&EXPOSE &port& [&port&...]。
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口。
ENV:格式为&ENV &key& &value&。 指定一个环境变量,会被后续&RUN&指令使用,并在容器运行时保持。这就对应程序语言中的变量定义,可在需要的时候引用。例如:
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL /postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && &
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD:格式为&ADD &src& &dest&。
该命令将复制指定的&&src&&到容器中的&&dest&。 其中&&src&&可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
COPY:格式为&COPY &src& &dest&。
复制本地主机的&&src&(为 Dockerfile 所在目录的相对路径)到容器中的&&dest&。当使用本地目录为源目录时,推荐使用&COPY。
COPY和ADD的不同就是:ADD多了自动解压和支持URL路径的功能。
ENTRYPOINT:
两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)。
配置容器启动后执行的命令,并且不可被&docker run&提供的参数覆盖。
每个 Dockerfile 中只能有一个&ENTRYPOINT,当指定多个时,只有最后一个起效。
CMD和ENTRYPOINT比较:两个命令都是只能使用一次,并且都是在执行docker run指令时运行,如果有多个,只执行最后一条。
两者的不同在于参数的传递方式,如果在Dockerfile中定义如下指令
CMD echo hello
ENTRYPOINT ["echo","hello"] 
那么在运行命令docker run containerId echo hello时,指定了CMD的输入结果为world,可以看出Dockerfile中指定的命令被覆盖了,而指定了ENTRYPOINT时,输出结果为hello echo world,可以看出指定的命令被作为ENTRYPOINT指定指令的参数了。
VOLUME:格式为&VOLUME ["/data"]。创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。不过此属性在Dockerfile中指定并没有什么意义,因为没有办法指定本地主机的目录。如果需要指定挂载点可以在执行docker run命令时指定:
docker run -it -v /home/fengzheng/ftp/:/data
c6d /bin/bash
USER:格式为&USER daemon。指定运行容器时的用户名或 UID,后续的&RUN&也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要临时获取管理员权限可以使用&gosu,而不推荐&sudo。
WORKDIR:格式为&WORKDIR /path/to/workdir。为后续的&RUN、CMD、ENTRYPOINT&指令配置工作目录。可以使用多个&WORKDIR&指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如
WORKDIR /a
则最终路径为&/a/b/c。
ONBUILD:格式为&ONBUILD [INSTRUCTION]。
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
例如,Dockerfile 使用如下的内容创建了镜像&image-A。
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
如果基于 image-A 创建新的镜像时,新的Dockerfile中使用&FROM image-A指定基础镜像时,会自动执行ONBUILD&指令内容,等价于在后面添加了两条指令。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用&ONBUILD&指令的镜像,推荐在标签中注明,例如&ruby:1.9-onbuild。
基于CentOS6.7并源码安装nginx
首先准备了nginx-1.9.9.tar.gz安装包和CentOS6-Base-163.repo(163源),将这两个文件放到同一目录下,并在此目录下创建名称为Dockerfile的文件。之后在此文件中实现源替换、nginx编译安装、及一些依赖包的安装,Dockerfile内容如下:
# this is a test ubuntu 12.04 image dockerfile
# Author:fengzheng
# Base image,this must be set as the first line
#localhost:5000/centos:6.7是我的私有仓库的镜像,可替换为centos:6.7(DockerHub中的镜像)
FROM localhost:5000/centos:6.7
MAINTAINER fengzheng
# Commands to update the image
RUN mkdir /usr/nginx1.9.9
ADD nginx-1.9.9.tar.gz /usr/nginx1.9.9/
#RUN yum -y install tar
#RUN tar -zxvf /usr/nginx1.9.9/nginx-1.9.9.tar.gz
RUN cd /etc/yum.repos.d/ && mv CentOS-Base.repo CentOS-Base.repo.bak
ADD CentOS6-Base-163.repo /etc/yum.repos.d/
RUN cd /etc/yum.repos.d/ && mv CentOS6-Base-163.repo CentOS-Base.repo \
&& yum clean all && yum makecache \
&& yum -y install gcc \
&& yum -y install yum install -y pcre-devel \
&& yum -y install zlib zlib-devel \
&& yum -y install openssl openssl--devel \
&& cd /usr/nginx1.9.9/nginx-1.9.9/ && ./configure && make && make install
#如果设置 nginx无法启动
#RUN echo "\" && /etc/nginx/nginx.conf
# Commands when creating a new container
# 启动nginx 需进入/usr/local/nginx/sbin 执行./configure
CMD /bin/bash
最后执行命令"docker build -t nginx-centos:6.7 ."
其中.表示在当前目录下搜索Dockerfile文件,-t参数指定镜像名称和tag。
阅读(...) 评论()

我要回帖

更多关于 创建iso镜像 的文章

 

随机推荐