Docker
本文转自本人博客
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
查看本地镜像
查看本地以及安装过的镜像信息,包含标识,名称,版本,更新时间,大小
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