c4rt1y

docker安装与使用

1.安装

#1.1 老版本docker
yum install docker -y

#1.2 最新版本的docker
cat >/etc/yum.repos.d/docker.repo <<EOF 
[dockerrepo] 
name=Docker Repository 
baseurl=https://yum.dockerproject.org/repo/main/centos/7 
enabled=1 
gpgcheck=1 
gpgkey=https://yum.dockerproject.org/gpg 
EOF	

yum install docker-engine -y

2.启动和放入启动项

centos7.0版本
systemctl start docker 
systemctl enable docker

#兼容老版本
service docker start
chkconfig docker on

3.docker使用

#3.1 查看docker信息

docker version			# 查看docker版本
docker info 			# 显示docker系统的信息  

#3.2 对image的操作

docker search [镜像] 		#搜索镜像
docker pull [镜像]  		#下载镜像

sudo docker pull ubuntu:12.04 等同于
docker pull registry.hub.docker.com/ubuntu:12.04 


docker push [镜像] 			#发布镜像
docker rmi [镜像] 			#删除镜像
docker images				#查看本地镜像(列目录)
docker history [镜像]			#历史镜像

docker rmi [镜像]/ID 			#删除镜像
docker rmi `docker images -q` 		#删除所有停止的镜像
docker rmi $(docker images -q) 		#删除所有停止的镜像
docker rmi -f `docker images -q` 	#强制删除所有的镜像
docker rmi -f $(docker images -q) 	#强制删除所有的镜像
docker rmi $(docker images -q -f dangling=true) #删除未打标签的镜像


#3.3 容器操作

#创建容器

docker run [镜像] /bin/echo hello world 		#输出hello world
docker run -i -t [镜像] /bin/bash  			#交互式进入容器
docker run [镜像]  apt-get install -y app_name  	#在容器安装新的程序


docker exec -it kali /bin/bash			#进入容器
docker run -it -d kali				#启动容器,后台运行
docker run -it -p 53:53 kali			#启动容器的时候可以映射端口


#数据卷
docker run -it -v /data:/data kali		#共享目录,本机和虚拟机共享data目录
docker run -it -v /data:/data:ro kali		#只读共享目录,本机和虚拟机共享data目录(虚拟机只读)


docker run -it -v /data --name web1 kali		#虚拟机web1创建共享目录
docker run -it --volumes-from web1 --name web2 kali     #共享web1的目录(不需要通过本机共享)

#数据卷疑问
#1、数据卷虚拟机开启或者关闭对共享无影响

#2、数据卷虚拟机多次作为共享目录,也可以做共享
docker run -it -v /data --name web1 kali				
docker run -it --volumes-from web1 -v /data1 --name web2 kali    
docker run -it --volumes-from web1 --volumes-from web2 --name web3 kali 

#3、数据卷多次挂在,有重复名字,则以最后一个--volumes-from的为最后结果

#4、如果已经挂在数据卷的容器,删除数据卷对其无影响


#对数据卷打包
#思路一:
#创建新的容器 使用-v,进入容器,打包,扔进本机和虚拟机共享目录,然后复制出来

#思路二:-v 共享本机backup目录,打包到文件为backup.tar  一条命令
docker run -it --volumes-from -v /backup:/backup web1 --name web2 kali tar cvf /backup/backup.tar



#查看容器

docker ps 				#列出当前运行的容器
docker ps -a 				#列出所有的容器
docker ps -l 				#列出最近一次启动的容器
docker ps -a -q 			#查看所有的容器ID



#容器操作
docker inspect [容器名字]/ID 		#显示容器信息

docker start [容器名字]/ID		#启动容器
docker stop [容器名字]/ID		#停止容器
docker kill [容器名字]/ID		#杀死容器
docker restart [容器名字]/ID		#重新启动容器
docker attach [容器名字]/ID		#进入容器
docker logs [容器名字]/ID		#查看容器日志
docker diff [容器名字]/ID		#查看容器修改操作
docker top [容器名字]/ID			#显示容器进程信息
docker cp ID:/path to_path		#从容器中拷贝数据到本地
docker cp [容器名字]:/path to_path	#从容器中拷贝数据到本地

#另类入容器方法
PID=docker inspect --format "{ {.State.Pid} }" [容器名字]/ID
nsenter -t $PID -u -i -n -p


docker commit ID [容器名字]		#保存修改容器( -a, --author="" Author; -m, --message="" Commit message  )


#删除容器
docker rm [容器]/ID 		#删除容器
docker rm `docker ps -a -q` 	#删除所有停止的容器
docker rm $(docker ps -a -q) 	#删除所有停止的容器
docker rm -f `docker ps -a -q` 	#强制删除所有的容器
docker rm -f $(docker ps -a -q) #强制删除所有的容器


#导出和导入容器

#方法一
docker save [容器名字] -o [路径]	#保存(保存镜像到一个tar包; -o, --output="" Write to an file  )
docker load -i [路径]		#加载( 加载一个tar包格式的镜像; -i, --input="" Read from a tar archive file )

#方法二
docker save [容器名字] > [路径]/xxxx.tar	#保存为tar格式
docker load [容器名字] < [路径]/xxxx.tar	#加载tar文件进入docker

4. 网络

#编辑内容
vi /usr/lib/systemd/system/docker.service{
	ExecStart=/usr/bin/dockerd  -H unix:///var/run/docker.sock  -H tcp://0.0.0.0:2375  --registry-mirror=https://docker.mirrors.ustc.edu.cn  --selinux-enabled=true 
}

#重启
systemctl daemon-reload
systemctl restart docker.service 

curl http://10.10.10.10:2375/info

docker -H tcp://10.10.10.10:2375 info

#第二台docker2访问第一台docker1
export DOCKRER_HOTS="tcp://10.10.10.10:2375"

#本机网络 -- link使用
#默认本机的网络docker0的ip为172.17.0.1段,可以相互ping。但是当docker虚拟机重启之后,IP会变化,导致无法达到ping目的虚拟机,从而引入了--link概念
docker run -it --name web1 ubuntu
docker run -it --name web2 --link=web1:web1 ubuntu
docker run -it --name web3 --link=web1:web1 --link=web2:web2 ubuntu

#禁止本机互联
vi /usr/lib/systemd/system/docker.service{
	ExecStart =/usr/bin/dockerd   --icc=false
}

#这个需要关联iptables

5. Dockerfile

5.1.Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
  一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

5.2.一开始必须指明所基于的镜像名称,接下来推荐说明维护者信息。
  后面则是镜像操作指令,例如 RUN 指令,RUN 指令将对镜像执行跟随的命令。
  每运行一条 RUN 指令,镜像添加新的一层,并提交。
  最后是 CMD 指令,来指定运行容器时的操作命令

5.3.指令
	1.FROM
		FROM <image>:<tag>

	2.MAINTAINER
		MAINTAINER <name>

	3.RUN
		RUN <command>
		RUN ["/bin/bash", "-c", "echo hello"]

		每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。
		当命令较长时可以使用 \ 来换行

	4.CMD
		支持三种格式

		CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
		CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
		CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
		指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD
		命令。如果指定了多条命令,只有最后一条会被执行。

		如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令

	5.EXPOSE
		格式为 EXPOSE <port> [<port>...]。

		告诉 Docker 服务端容器暴露的端口号,供互联系统使用。
		在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口

	6.ENV
		ENV <key> <value>。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持

		ENV PG_MAJOR 9.3
		ENV PG_VERSION 9.3.4
		RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
		ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

	7.ADD
		格式为 ADD <src> <dest>。

		该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;
		也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)

	8.COPY

		格式为 COPY <src> <dest>。

		复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>。
		当使用本地目录为源目录时,推荐使用 COPY

	9.ENTRYPOINT

		两种格式:

		ENTRYPOINT ["executable", "param1", "param2"]
		ENTRYPOINT command param1 param2(shell中执行)。
		配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

		每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效

	10.VOLUME

		格式为 VOLUME ["/data"]。

		创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

	11.USER

		格式为 USER daemon。

		指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

	12.WORKDIR

		格式为 WORKDIR /path/to/workdir。

		为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。

		可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

		WORKDIR /a
		WORKDIR b
		WORKDIR c
		RUN pwd
		则最终路径为 /a/b/c

	13.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
GoTop