关于docker
0x01 docker介绍
docker是使用google公司推出的go语言进行开发的一款linux虚拟容器。可以简单的理解为linux下的虚拟机,用户可以使用其提供的接口来方便的实现容器的创建和销毁。有了docker虚拟容器,再也不用担心我的服务器给人黑了。
0x02 基本概念
镜像
docker镜像是一个特殊的文件系统,里面包括了容器运行所需的系统程序、资源、以及各种配置。
容器
容器相对于镜像来说是动态的,可以被创建、启动停止、删除、和暂停。可以这样理解,镜像就好比一个类,而容器就是类的实例。
仓库
仓库即镜像的集合,docker hub就是这样的一个镜像仓库。
0x03 docker安装
yum install docker
不同的系统都有不同的安装方式,这里不赘述,可自行百度。
0x04 docker基本命令
查看版本信息
docker --version
查看本地所有镜像
docker images
搜索centos镜像
docker search centos
获取centos镜像
docker pull centos
运行一个docker镜像,产生一个容器实例
docker run centos
docker run {镜像id前三位运行 }
运行一个docker镜像,并进入到容器的bash(exit退出)
docker run -it centos bash
列出正在运行的容器
docker ps
列出所有运行过的容器
docker ps -a
停止所有正在运行的容器
docker stopdocker ps -aq
0x05 容器的启动
docker的容器有两种方式。
1.基于镜像新建一个容器并启动
root@ubuntu:/home/vincent# docker run -d -it centos bash
ce5ad1718d40a57467c9247d970d0c2dcc1026c9b19bbd6b5e4650e129bf3146
#-d 表示后台运行
#-it 让容器标准输入保持打开并绑定,并分配一个伪终端
# bash 指定docker容器,用shell解释器交互
查看正在运行的docker容器
root@ubuntu:/home/vincent# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53641ccb69c1 centos "bash" 2 minutes ago
进入id为536开头的容器的交互模式
root@ubuntu:/home/vincent# docker exec -it 536 bash
[root@53641ccb69c1 /]#
2.将一个终止状态(stopped)的容器重新启动
先查询已经运行过的容器的id前3位数字
root@ubuntu:/home/vincent# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53641ccb69c1 centos "bash" 10 minutes ago Exited (137) 37 seconds ago sharp_brattain
再启动
root@ubuntu:/home/vincent# docker start 536
536
进入交互模式
root@ubuntu:/home/vincent# docker exec -it 536 bash
[root@53641ccb69c1 /]#
0x06 用dockefile定制镜像
dockerfile其实就是一种用来定制自定义环境镜像的脚本文件,通过docker的参数指令来构建一个自定义镜像。
下面介绍一下参数:
- FROM centos #使用centos基础镜像,这里也可以用别人上传到仓库的镜像,下面有例子
- MAINTAINER vint #作者名字
- ADD /source /var #把source文件夹里的内容添加到容器的var目录下
- ADD test.tar.gz / # 添加到根目录并解压
- RUN apt-get update #运行apt-get更新的命令
- WORKDIR /root #相当于linux的cd命令
- ENV MYSQL_VERSION 5.6 # 设置一个mysql常量
- EXPOSE 80 #开放容器的80端口
- CMD echo ”hello docker” #设置容器启动后默认执行的命令和参数
这里ADD参数有个坑就是,它会把本地文件的压缩文件添加到容器内后并自动解压,注意绕过这个坑。可以用COPY参数。
这里贴一下我们这次国赛为web题目所写的dockerfile文件作为参考:
FROM nienie/ciscn_web:7.0
ADD ./flag /flag
ADD run.sh /usr/local/sbin/run.sh
RUN chmod 755 /usr/local/sbin/run.sh && \
apt-get -y install uuid
RUN service ssh start && \
chmod -R 777 /var/www/html/.* && \
chown -R ciscn /var/www/html/ && \
rm -rf /var/www/html/*
COPY /source/www /var/www/html
EXPOSE 80
CMD ["/usr/local/sbin/run.sh"]
其实也很简单,我们直接用了上一年我们师兄所准备的镜像(因为那个镜像已经有了apache等环境,比较方便),然后把所需的文件都挂载上去后,再运行一些开启服务的命令和脚本,这个dockerfile就完成了。
需要的注意的地方是,要填加到容器中的source文件夹等要放在与dockerfile同一个目录下。
0x07 用dockerfile创建容器
首先,要构建出我们用dockerfile写的自定义镜像。
在dockerfile的当前目录下
root@ubuntu:/home/vincent# docker build -t vint-test .
# -t tag的缩小,表示这个镜像的标签名字
# . 表示根据当前目录下的dockerfile来创建
创建好镜像后,就是创建容器了,方法我们上面已经讲过,这里我们在新加一个端口映射
root@ubuntu:/home/vincent# docker run -d -it -p 8080:80 vint-test bash
# -p 8080:80 把容器的80端口映射到本地的8080端口上
关于docker的知识先到这里吧,这样已经够日常的使用了,有关更加深的知识点以后再继续补充完善。