docker基本命令的使用
container
容器。可以把每个 container 看做是一个独立的主机。 container 的创建通常有一个 image 作为其模板。类比成虚拟机的话可以理解为 image 就是虚拟机的镜像,而 container 就是一个个正在运行的虚拟机。一个虚拟机镜像可以创建出多个运行的虚拟主机且相互独立。 注意:container 一旦创建如果没有用 rm 命令移除,将会一直存在。所以用完后记得删除哦。
image
镜像。image 相当于 container 的模板,container 创建后里面有什么软件完全取决于它使用什么 image 。image 可以通过 container 创建(相当于把此时 container 的状态保存成快照),也可以通过 Dockerfile (一个文本文件,里面使用 docker 规定的一些写法)来创建。其中通过 Dockerfile 创建的方法能让环境配置和代码一起被版本库一起管理。
registry
存放镜像的仓库。只要能连接到 registry 每个人都可以很方便地通过 pull 命令从仓库中获取镜像。docker 默认使用的仓库是 docker hub,国内可以使用 DaoCloud 来建立 Mirror 连接到 docker hub,进而加快获取 image 的速度。
拉取镜像:
docker pull **
上传镜像:
docker push **
查看镜像:
docker images
查看运行的container:
docker ps
查看所有的container:(运行和停止的)
docker ps -a
查看docker的帮助会发现有两个与删除有关的命令rm和rmi
rm Remove one or more containers
rmi Remove one or more images
由于image被某个container引用(拿来运行),如果不将这个引用的container销毁(删除),那image肯定是不能被删除。
所以想要删除运行过的images必须首先删除它的containe
docker stop containerId
docker rm comtainerId
docker rmi imageId
运行image,需要启动container:(如果你之前没有创建container,则需要基于image新创建一个container)
创建并运行 container后进入其bash控制台
docker run -t -i image /bin/bash
-i:标准输入给容器 -t:分配一个虚拟终端 /bin/bash:执行bash脚本
-d:以守护进程方式运行(后台)
-P:默认匹配docker容器的5000端口号到宿主机的
-p <HOT_PORT>:<CONTAINER_PORT>:指定端口号
- -name: 指定容器的名称
创建并运行 container 并让其在后台运行,并端口映射
docker run -p 5000:5000 -d training/webapp python app.py
进入container
docker exec -it containerId /bin/bash
启动停止container(如果你之前已经创建过container)
docker start containerId
docker stop containerId
创建image的两种方式:
方式一:保存对container的修改,变为image
docker commit [container] [imageName]
方式二:从 Dockerfile 创建 image
docker build -t [imageName] [pathToFolder] # -t 指定tag
要记得一定保证Dockerfile文件和安装包在一个目录下
当Dockerfile和当前执行命令的目录不在同一个时,我们也可以指定Dockerfile,如
docker build -f /var/nginx_build/Dockerfile .
Dockerfile的基本指令有十三个,分别是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD
类型 命令
基础镜像信息 FROM
维护者信息 MAINTAINER
镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令 CMD、ENTRYPOINT
1.1、FROM :指定基础镜像
先pull下来再修改
1.2、 RUN:执行命令
RUN指令在新镜像内部执行的命令,如:执行某些动作、安装系统软件、配置系统信息之类,
shell格式:RUN< command > ,就像直接在命令行中输入的命令一样。
注:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错,RUN书写时的换行符是\
1.3、COPY:复制文件
COPY命令用于将宿主机器上的的文件复制到镜像内,如果目的位置不存在,Docker会自动创建。但宿主机器用要复制的目录必须是和Dockerfile文件统计目录下。
格式:
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
如把宿主机中的package.json文件复制到容器中/usr/src/app/目录下:
COPY package.json /usr/src/app/
1.4、CMD:容器启动命令
CMD命令用于容器启动时需要执行的命令,CMD在Dockerfile中只能出现一次,如果出现多个,那么只有最后一个会有效。
其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令,没提供就会使用构建时的命令。
格式:
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
1.5 MAINTAINER:指定作者
用来指定dockerfile的作者名称和邮箱,主要作用是为了标识软件的所有者是谁。
1.6、EXPOSE:暴露端口
EXPOSE命名适用于设置容器对外映射的容器端口号,如tomcat容器内使用的端口8081,则用EXPOSE命令可以告诉外界该容器的8081端口对外,在构建镜像时用docker run -p可以设置暴露的端口对宿主机器端口的映射。
语法:
EXPOSE 8081
EXPOSE 8081 其实等价于 docker run -p 8081 当需要把8081端口映射到宿主机中的某个端口(如8888)以便外界访问时,则可以用docker run -p 8888:8081
1.7、WORKDIR:配置工作目录
WORKDIR命令是为RUN、CMD、ENTRYPOINT指令配置工作目录。其效果类似于Linux命名中的cd命令,用于目录的切换,但是和cd不一样的是:如果切换到的目录不存在,WORKDIR会为此创建目录。
语法:
WORKDIR path
1.8、ENTRYPOINT:容器启动执行命名
ENTRYPOINT的作用和用法和CMD一模一样,但是ENTRYPOINT有和CMD有2处不一样:
CMD的命令会被docker run的命令覆盖而ENTRYPOINT不会
CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖
1.9、VOLUME
VOLUME用来创建一个可以从本地主机或其他容器挂载的挂载点。例如我们知道tomcat的webapps目录是放web应用程序代码的地方,此时我们要把webapps目录挂载为匿名卷,这样任何写入webapps中的心都不会被记录到容器的存储层,让容器存储层无状态化。
格式:
VOLUME /usr/local/tomcat/webapps
这样,在运行容器时,也可以用过docker run -v来把匿名挂载点挂载都宿主机器上的某个目录,如
docker run -d -v /home/tomcat_webapps:/usr/local/tomcat/webapps
1.10、 USER
USER命令用于指定当前望下执行的用户,需要注意的是这个用户必须是已经存在,否则无法指定。它的用法和WORKDIR有点像,切换用户。
1.11、ADD
作用比COPY强大,会自动解压。
1.12、ONBUILD
ONBUILD用于配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
意思就是:这个镜像创建后,如果其它镜像以这个镜像为基础,会先执行这个镜像的ONBUILD命令
格式:
ONBUILD [INSTRUCTION]
1.13、ENV:设置环境变量
ENV命名用于设置容器的环境变量,这些变量以”key=value”的形式存在,在容器内被脚本或者程序调用,容器运行的时候这个变量也会保留。
格式:
1) 设置一个: ENV <key> <value>
2) 设置多个:ENV <key1>=<value1> <key2>=<value2>...
如设置一个环境变量JAVA_HOME,接下来的命名就可以使用这个变量:
ENV JAVA_HOME /opt/jdk
ENV PATH $PATH:$JAVA_HOME/bin
在使用ENV设置环境变量时,有几点需要注意:
1)具有传递性,也就是当前镜像被用作其它镜像的基础镜像时,新镜像会拥有当前这个基础镜像所有的环境变量
2)ENV定义的环境变量,可以在dockerfile被后面的所有指令(CMD除外)中使用,但不能被docker run 的命令参数引用
如:
ENV tomcat_home_name tomcat_7
RUN mkdir $tomcat_home_name
3)除了ENV之外,docker run -e 也可以设置环境变量传入容器内。
如:
docker run -d tomcat -e "tomcat_home_name=tomcat_7"
这样我们进入容器内部用ENV可以看到tomcat_home_name这个环境变量。
Dockerfile的编写
我们先看一个例子
#在centos上安装nginx
FROM centos
#标明著作人的名称和邮箱
MAINTAINER jiabuli 649917837@qq.com
#测试一下网络环境
RUN ping -c 1 www.baidu.com
#安装nginx必要的一些软件
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
#把nginx安装包复制到/usr/src/目录下
ADD nginx-1.15.8.tar.gz /usr/src/
#切换到/usr/src/nginx-1.15.8编译并且安装nginx
RUN cd /usr/src/nginx-1.15.8 \
&& mkdir /usr/local/nginx \
&& ./configure --prefix=/usr/local/nginx && make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
&& nginx
#删除安装nginx安装目录
RUN rm -rf /usr/src/nginx-nginx-1.15.8
#对外暴露80端口
EXPOSE 80
#启动nginx
CMD ["nginx", "-g", "daemon off;"]
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
1 FROM registry.anhouse.com.cn/library/centos-python3.6:v3
2 MAINTAINER BY WANGZHENG663
3 ADD pack-zhicai-recognize.tar.gz /data1/www/paf_release/
4 RUN [ -f '/data1/www/paf_release//pack-zhicai-recognize/bin/app_control.bash' ] && sed -i 's/-javaagent:\${APM_DIR}/\${JAVA_WISE}/g' /data1/www/paf_release//pack-zhicai-recognize/bin/app_control.bash || echo 1
5 ADD apm-agent.tar.gz /data1/www/paf_release/
6 ENTRYPOINT cd /data1/www/paf_release/pack-zhicai-recognize && python3.6 manage.py
7 EXPOSE 5000
最后均需要构建container运行
容器的生命周期。要把docer容器看做是一个单独的进程及运行环境。容器不等价于一个虚拟的操作系统。Docker的开发人员也一直主张doder容器应该只运行一个进程。例如,一个web server服务就是一个进程。docker run命令就是为了运行一个进程。当一个进程结束了,那么docker容器也就结束了。
docker run -t -i image /bin/bash # 注意:后台运行加 -d
Docker 镜像采用分层的技术,所以创建过程中每一个命令都相当于一层:
step1:
step2:
…
容器快照传递:
导出容器,语法:docker export $container_id > 容器快照名
导入容器, 语法:cat centos.tar | docker import - my/centos:v888
k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。
k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行。