PRELOADER

当前文章 : 《docker学习笔记》

8/20/2019 —— 

前言

在国赛的准备web题目的时候实在是踩了太多坑,虽然上一年就有接触过docker了,不过没有太长时间没有用过了,导致重新用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的知识先到这里吧,这样已经够日常的使用了,有关更加深的知识点以后再继续补充完善。

参考链接:

https://mp.weixin.qq.com/s/3KQHidxnKGxOrOO0WPlosg

https://www.t00ls.net/thread-45091-1-1.html