#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
centos7.0版本
systemctl start docker
systemctl enable docker
#兼容老版本
service docker start
chkconfig docker on
#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
#编辑内容
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.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