1.什么是 Dcoker
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库(Repository)类似 Git 的远程仓库,集中存放镜像文件。
2.修改 yum 源
1、下载 wget
yum install wget -y
2、创建目录
mkdir -p /etc/yum.repos.d
3、下载阿里云 yum 源配置
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
4、更新缓存
yum clean all yum makecache
3.安装 docker
1、安装前置条件
docker 要求 Linux 内核要 3.1.0 以上版本,如果 centos6.x 内核是 2.x,需要升级 linux 内核
uname -r #查看内核版本
yum update #内核版本低于3.10,使用yum update更新到最新
2、安装步骤
1)升级本地 yum 包
yum update
2) 安装工具集
安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的。
yum install -y yum-utils device-mapper-persistent-data lvm2
3)设置 docker 阿里云源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4)更新 yum 缓存
yum makecache fast yum clean all
5)安装 docker
//安装最新稳定版本
yum -y install docker-ce
//安装指定稳定版本
yum list docker-ce --showduplicates | sort -r #查看所有仓库中所有docker版本
yum install docker-ce-version #例如sudo yum install docker-ce-18.03.0.ce
6)卸载 docker
sudo yum remove docker
7)查看 docker 版本
docker -v
8)启动 docker 服务并加入开机启动
1> systemctl start docker //启动docker
2> systemctl enable docker.service //设置开机自启
3>sudo systemctl daemon-reload //守护进程重启
4>docker的启动停止命令
//启动docker
systemctl start docker
//关闭docker
systemctl stop docker
//启动 docker 服务
service docker start
//重启docker服务
service docker restart
//关闭docker服务
service docker stop
9)docker 设置镜像(未设置镜像)
docker pull 很慢解决办法,经常拉取镜像的时候很慢或者拉不下来,这里可以使用阿里云镜像加速器,然后试试看有没有效果
##使用阿里云镜像加速器
[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}
EOF
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
4.docker 的基本操作
1>常用命令
##
2>镜像仓库
Docker Hub 镜像仓库
//检索镜像
docker search 关键字
//拉取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
3>镜像
a>镜像管理
//列出镜像
docker image ls
docker images
//删除指定镜像
docker rmi <镜像Id>
//将镜像保存为归档文件
docker save
//导入镜像
docker load
b>镜像构建
docker build
c>镜像运行
镜像运行,就是新建并运行一个容器。
docker run [镜像ID]
4>容器
a>.容器生命周期
- 启动:启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
- 启动容器
#新建并启动
docker run [镜像名/镜像ID]
#启动已终止容器
docker start [容器ID]
- 查看容器
# 列出本机运行的容器
docker ps
# 列出本机所有的容器(包括停止和运行)
docker ps -a
- 停止容器
# 停止运行的容器
docker stop [容器ID]
# 杀死容器进程
docker kill [容器ID]
- 重启容器
docker restart [容器ID]
- 删除容器
docker rm [容器ID]
5>创建容器并运行
docker run -it -d --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=always halohub/halo
- -it:开启输入功能并连接伪终端
- -d:后台运行容器
- –name:为容器指定一个名称
- -p:端口映射,格式为主机(宿主)端口:容器端口,可在 application.yaml 配置。
- -v:工作目录映射。形式为:-v 宿主机路径:/root/.halo,后者不能修改。
- –restart:建议设置为 always,在 Docker 启动的时候自动启动 Halo 容器。
###
6>docker 内部容器自动重启配置
1.创建容器时没有添加参数 –restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动。
docker ps -a
docker container update --restart=always [容器名字]
操作实例如下:
[root@localhost mnt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46cdfc60b7a6 nginx "nginx -g 'daemon ..." About a minute ago Up 42 seconds 80/tcp n3
79d55a734c26 nginx "nginx -g 'daemon ..." About a minute ago Up 42 seconds 80/tcp n2
f7b2206c019d nginx "nginx -g 'daemon ..." About a minute ago Up 46 seconds 80/tcp n1
[root@localhost mnt]# docker container update --restart=always n1
n1
[root@localhost mnt]# systemctl restart docker
[root@localhost mnt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46cdfc60b7a6 nginx "nginx -g 'daemon ..." 2 minutes ago Exited (0) 5 seconds ago n3
79d55a734c26 nginx "nginx -g 'daemon ..." 2 minutes ago Exited (0) 5 seconds ago n2
f7b2206c019d nginx "nginx -g 'daemon ..." 2 minutes ago Up 2 seconds 80/tcp n1
2.docker-compose 关机或者重启 docker 同时重启容器 restart always 的配置
存粹使用 docker 启动的话需要加–restart=always 即可实现这个功能,而使用 docker-compose 的话在相关服务配置下加 restart: always 就行。
version: '2'
services:
database:
build: ./mysql/
command: mysqld --user=root --verbose
restart: always
environment:
MYSQL_DATABASE: "web_level3_sqli"
MYSQL_USER: "web_level3_sqli"
MYSQL_PASSWORD: "thisisasecurepassword123"
MYSQL_ROOT_PASSWORD: "root"
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
web:
build: ./www/
restart: always
ports:
- "12000:80"
volumes:
- ./www/src:/var/www/html
links:
- database