Docker 架构

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

可以这么认为

  • 集装箱(镜像): 会将所有需要的内容放到不同的集装箱,谁需要这些环境就直接拿走(pull)这个集装箱就可以了,而docker有一个大码头,所有的集装箱都放在这里(中央仓库)
  • 隔离性: Docker在运行集装箱内内容时,会在Linux的内核中,单独开闭一片空间,这片空间不会影响到其他应用程序,一定程度上增加了安全性
  • 容器:运行起来的镜像

Docker 安装

乌班图系统可使用以下命令一键安装

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

或者使用daocloud一键安装

curl -sSL https://get.daocloud.io/docker | sh

安装成功之后,手动启动,设置为开机自启,并测试一下Docker

# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试
docker run hello-world

Docker 镜像加速

安装完之后建议换源,否则从中央仓库拖容器的时候巨慢无比,建议使用阿里云的Docker镜像加速

阿里云镜像获取地址:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:
https://********.mirror.aliyuncs.com

获取链接之后,在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件):

{"registry-mirrors":["https://********.mirror.aliyuncs.com"]}

修改之后重启服务

sudo systemctl daemon-reload
sudo systemctl restart docker

此外,可以尝试使用国内的一些仓库,本人常用的是

http://hub.daocloud.io/

镜像的操作

拉取镜像

从中央仓库拉取镜像到本地

docker pull 镜像名称[:tag]

# 如: docker pull daocloud.io/library/nginx:latest
#     docker pull php:5.6-fpm

img

查看本地镜像

查看本地以及安装过的镜像信息,包含标识,名称,版本,更新时间,大小

docker images

删除本地镜像

镜像会占用磁盘空间,可以手动删除

docker rmi 镜像的标识

镜像的导入和导出

# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

容器的操作

运行容器

运行容器需要制定具体镜像,如果就像不存在则直接下载

# 简易操作
docker run 镜像的标识|镜像名称[:tag]

# 常见参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d: 标识后台运行容器
# -p 宿主机端口:容器端口: 为了映射当前Linux的端口和容器的端口
# --name 容器名称: 指定容器的名称

查看正在运行的容器

docker ps [-qa]
# -a: 查看全部的容器,包括没有运行的
# -q: 只查看容器的标识

查看容器日志

docker logs -f 容器id
# -f: 可以滚动查看日志的最后几行

进入容器内部

# 可以进入容器内部进行操作
docker exec -it 容器id bash

复制内容到容器

# 讲宿主机的文件复制到容器内部的指定目录
docker cp 文件名称 容器id:容器内部路径

重启&启动&停止&删除容器

# 重新启动容器
docker restart 容器id

# 启动停止运行的容器
docker start 容器id

# 停止指定的容器(得先停止容器再删除)
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)

# 删除指定的容器
docker rm 容器id
# 停止全部容器
docker rm $(docker ps -qa)

数据卷

数据卷: 讲宿主机的一个目录映射到容器的一个目录中

可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变

创建数据卷

# 创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volumes/
docker volume create 数据卷名称

查看全部数据卷

# 查看全部数据卷信息

docker volume ls

查看数据卷详情

# 查看数据卷的详细信息,可以查询到存放的路径,创建时间等等

docker volume inspect 数据卷名称

删除数据卷

# 删除指定的数据卷

docker volume rm 数据卷名称

容器映射数据卷

映射有两种方式:

通过数据卷名称映射,如果数据卷不存在。Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。 通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置。但是这个路径下是空的。

# 通过数据卷名称映射
docker run  -v 数据卷名称:容器内部的路径 镜像id
# 通过路径映射数据卷
docker run -v 路径:容器内部的 镜像id

Dockerfile

我们可以通过创建Dockerfile来自定义创建镜像

from : 指定当前自定义镜像依赖的环境
copy : 讲相对路径下的内容复制到自定义镜像中
workdir : 声明镜像的默认工作目录
run : 执行的命令,可以编写多个
cmd : 需要执行的命令(在workdir下执行,cmd可以写多个,只以最后一个为准
EXPOSE [端口号] :映射到宿主机的端口,这个命令主要体现在启动容器时所执行的命令,

下面以AntSword-Labs\bypass_disable_functions\1为例

# 拉取apache镜像
FROM php:5.6.11-apache         

# 复制文件到容器内部
COPY src/shell.php /var/www/html/index.php
COPY src/shell.php /var/www/html/ant.php

COPY src/php.ini /usr/local/etc/php/php.ini


COPY src/start.sh /start.sh

# 执行系统命令
RUN set -x \
  && chmod +x /start.sh \
  && chown -R www-data:www-data /var/www/html

# 映射80端口
EXPOSE 80
# 执行命令文件
ENTRYPOINT [ "/start.sh" ]

通过dockerfile制作镜像

编写完Dockerfile后需要通过命令将其制作为镜像,并且要在Dockerfile的当前目录下,之后即可在镜像中查看相关信息,注意最后的 .

# 制作镜像
docker build -t 镜像名称[:tag] .

Docker-compose

可以通过Docker-Compose编写镜像参数,而且Docker-Compose可以帮助我们批量的管理容器,这些信息只需要通过一个docker-compose.yml去维护

Docekr-compose的安装

推荐使用pip一键式操作

pip install docker-compose

安装完成之后尝试输入

docker-compose -version

# 出现类似以下信息即为安装成功
# docker-compose version 1.26.2, build unknown

Docker-Compose管理容器

这里以AntSword-Labs\bypass_disable_functions\1为例

version: '2'    # 说明yml文件的版本号,一般使用2或3
services:       # yml文件的主体,定义服务配置
  web:          # 服务名称,可自定义
    build:      # 构建自定义镜像
      context: ./    # 指定fockerfile的所在路径
      dockerfile: Dockerfile    # 指定Dockerfile文件名称
    image: antswordproject/antsword-labs:bypass_disable_functions_1   # 指定文件路径
    ports:
      - "18080:80"    # 映射端口,相当于之前的-p

再来一个mysql的yml

version: '3.1'
services:
  mysql:           # 服务的名称
    restart: always   # 代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/mysql:5.7.4  # 指定镜像路径
    container_name: mysql  # 指定容器名称
    ports:
      - 3306:3306   #  指定端口号的映射
    environment:
      MYSQL_ROOT_PASSWORD: root   # 指定MySQL的ROOT用户登录密码
      TZ: Asia/Shanghai        # 指定时区(TimeZone)
    volumes:
     - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql   # 映射数据卷

使用docker-compose命令管理容器

在使用docker-compose的命令时,默认会在当前目录下找docker-compose.yml文件

# 1.基于docker-compose.yml启动管理的容器
docker-compose up -d

# 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像存在,则直接运行这个镜像,如果需要重构
# 重新构建自定义镜像
docker-compose build
# 运行当前内容,并重新构建
docker-compose up -d --build

# 2.关闭并删除容器
docker-compose down

# 3.开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart

# 4.查看由docker-compose管理的容器
docker-compose ps

# 5.查看日志
docker-compose logs -f
说点什么
评论之后转圈圈也不用管,要批准之后才能显示,谢谢
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...