一:基础环境搭建

下面的内容系统版本都是Centos 7

1:安装需要的软件包

首先需要卸载原先的docker版本(旧版本和新版本不兼容)

yum remove docker docker-client docker-client-latest  docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

yum环境需要网络yum源仓库

yum install -y yum-utils device-mapper-persistent-data lvm2

2:配置阿里docker源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3:安装docker

yum install -y docker-ce

4:安装后查看已安装的docker版本

docker -v

5:查看docker版本详细信息

docker info

二:docker的简单操作

1:启动一台虚拟机查看

docker run -it centos

docker部署思源 docker 思源笔记_linux

2:查看虚拟机的状态

docker ps

docker部署思源 docker 思源笔记_php_02

3:查看docker虚拟机的ip

docker inspect 7b37ffc9ec34

解析:docker inspect 虚拟机ID(使用docker ps查看的CONTAINER ID 列)

docker部署思源 docker 思源笔记_php_03

4:连接docker容器

docker exec -it 7b37ffc9ec34 bash

解析:docker exec -it 虚拟机的ID bash

docker部署思源 docker 思源笔记_php_04

三:镜像的管理

简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。

1:配置国内的docker源

docker支持的容器列表

vi /etc/docker/daemon.json

插入以下内容

{
  "registry-mirrors": [ "https://registry.docker-cn.com"]
}

重启docker服务

systemctl restart docker

2:拉取nginx镜像

解析:使用pull拉取镜像

docker pull nginx:1.12

解析:冒号后面加上版本号,不加默认下最新版本

3:查看现有的docker镜像

docker images

扩展:查看仓库所有匹配镜像

docker search -f mysql

4:查看docker分层信息

docker部署思源 docker 思源笔记_linux_05


镜像不是一个单一的文件,而是有多层构成。

Docker镜像默认存储在/var/lib/docker/overlay2中。

容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。

Docker使用存储驱动管理镜像每层内容及可读写层的容器层

docker history nginx:1.12

解析:nginx:1,12 指定查看的镜像加具体的版本信息(只能查看本地已缓存的镜像文件)

5:docker支持的驱动

docker部署思源 docker 思源笔记_docker部署思源_06


docker部署思源 docker 思源笔记_linux_07

四:镜像管理命令

1:拉取镜像

docker pull nginx:1.12

解析:冒号后面加上版本号,不加默认下最新版本

2:查看现有镜像

docker images

3:删除镜像

docker mage rm 镜像:标签

docker部署思源 docker 思源笔记_docker_08

docker rmi 镜像:标签

docker部署思源 docker 思源笔记_linux_09

4:镜像标签

打tag标签

docker tag nginx:1.11 nginx:a1

5:导出镜像(拉取的镜像文件)

docker save centos > centos1

6:导入镜像

docker load < centos

7:运行容器(运行的虚拟机)

docker run -itd centos

8:导出容器

docker export 容器id > centos.tar

解析:查看容器id:docker ps

9:导入容器(保存为镜像仓库)

docker import centos.tar centos1:12

解析:centos1:12 是创建的一个镜像标签(如果没有则镜像名称显示为none)

五:容器管理

docker容器默认存放位置

docker容器默认存放于/var/lib/dockercontainers/

1:创建一个容器

docker run -itd --name a1 centos

解析:
–name 定义容器的名称(可以理解为容器的标签)
centos 创建容器使用的镜像(通常通过pull命令拉取)
可使用快捷键Ctrl + P + Q 来退出容器时不自动停止

扩展:创建容器的常见选项

指令

描述

资源限制指令

描述

-i, --interactive

交互式

-m,–memory

容器可以使用的最大内存量

-t, --tty

分配一个伪终端

–memory-swap

允许交换到磁盘的内存量

-d, --detach

运行容器到后台

–memory-swappiness=<0-100>

容器使用SWAP分区交换的百分比(0-100,默认为-1)

-a, --attach list

附加到运行的容器

–memory-reservation

内存软限制,Docker检测主机容器争用或内存不足时所激活的软限制,使用此选项,值必须设置低于—memory,以使其优先

–dns list

设置DNS服务器

–oom-kill-disable

当宿主机内存不足时,内核会杀死容器中的进程。建议设置了-memory选项再禁用OOM。如果没有设置,主机可能会耗尽内存

-e, --env list

设置环境变量

–cpus

限制容器可以使用多少可用的CPU资源

–env-file list

从文件读取环境变量

–cpuset-cpus

限制容器可以使用特定的CPU

-p, --publish list

发布容器端口到主机

–cpu-shares

此值设置为大于或小于默认1024值,以增加或减少容器的权重,并使其可以访问主机CPU周期的更大或更小比例

-P, --publish-all

发布容器所有EXPOSE的端口到宿主机随机端口

-h, --hostname string

设置容器主机名

–ip string

指定容器IP,只能用于自定义网络

–link list

添加连接到另一个容器

–network

连接容器到一个网络

–mount mount

挂载宿主机分区到容器

-v, --volume list

挂载宿主机目录到容器

–restart string

容器退出时重启策略,默认no[always|on-failure]

–add-host list

添加其他主机到容器中/etc/hosts

扩展创建容器命令

docker run -itd --name a2 -e a=123 -p 8080:80 --restart=always --memory 1024m --cpus 1 centos

解析:

-e a=123 创建容器是指定变量
-p 8080:80  将宿主机的8080端口映射到容器的80端口
--restart=always 容器关闭时自动启动
--memory 1024m 指定容器最大只能使用1024M的内存
--cpus 指定容器只能使用一核CPU

2:连接一个开启的容器

使用attach连接

docker attach a1

解析:a1可替换为容器的ID

使用exec连接

docker exec -it a1 bash

使用该操作可以在容器外使用命令

docker exec a1 ls /root

3:容器的状态操作

关闭开启的容器

docker stop a1

打开关闭的容器

docker start a1

将开启的容器重新启动

docker restart a1

将关闭的容器删除

docker rm a1

4:实时查看容器使用的资源

docker stats

解析:后面可跟容器名查看指定的容器资源使用

docker部署思源 docker 思源笔记_linux_10

5:查看容器的详细信息

docker inspect nginx1

6:查看运行的容器的进程

docker top nginx1

docker部署思源 docker 思源笔记_docker_11

7:将导出的容器提交为一个镜像

docker commit a1 a1:20

docker部署思源 docker 思源笔记_php_12

8:拷贝一个文件进容器里面

docker cp 文件名/文件目录 容器名:/目录

六:应用数据的管理

参数

docker volume --help

选项

解析

create

创建

inspect

查看卷信息

ls

查看已有卷

prune

清理卷缓存

rm

删除卷

1:创建卷

docker volume create centos-vo1

解析:centos-vo1 是起的卷名

2:查看已有卷

docker volume ls

查看卷的详细信息

docker volume inspect centos-vo1

docker部署思源 docker 思源笔记_php_13

3:使用卷创建一个容器

一个卷可挂载多个容器

docker run -itd --name volume-text --mount  src=centos-vo1,dst=/var/www/html centos

解析:

rc=centos-vo1   使用哪个卷
dst=/var/www/html centos 将容器的那个目录挂载到卷里

这个等于

docker run -itd --name volume-text -v  centos-vo1:/var/www/html centos

mount 支持选择格式
-v 不支持

扩展:挂载宿主目录

docker run -itd --name volume-text --mount type=bind,src=/root/123,dst=/var/www/html centos

解析:指定挂载点的格式为bind(目录格式)(原文件会隐藏)

七:网络管理

1:四种网络类型

1:bridge(桥接模式)

默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。

docker部署思源 docker 思源笔记_linux_14

2:host

容器不会获得一个独立的network namespace,而是与宿主机共用一个。

3:none

获取独立的network namespace,但不为容器进行任何网络配置。

4:container

与指定的容器使用同一个network namespace,网卡配置也都是相同的。

八:实战:使用docker搭建LNMP平台

项目目标
创建两个docker容器
1:创建一个mysql的docker容器
2:创建一个PHP的docker容器

1:创建一个网络

docker network create lnmp

2:创建docker卷

docker volume create mysql-vol

2:创建mysql的容器

拉取mysql的容器镜像文件

docker run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 --character-set-server=utf8

3:创建数据库

docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'

4:创建PHP的容器

docker run -itd --name lnmp_web --net lnmp -p 88:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm

解析:我这里宿主机端口88(我的环境中PHP默认80端口已被使用)

5:以wordpress博客为例测试

wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
tar zxf wordpress-4.7.4-zh_CN.tar.gz -C /app/wwwroot

6:浏览器测试访问

http://IP:88/wordpress 如果出现访问不了的时候请配置相关的防火墙和selinux

九:Dockerfile

1:Dockerfile指令

docker部署思源 docker 思源笔记_docker_15

扩展:创建搭建PHP网站环境镜像

1:编写dockerfile文件内容

创建dockerfile文件

touch dockerfile-PHP

添加一下内容

FROM centos:7
MAINTAINER www.aliangedu.com
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
ADD php-5.6.31.tar.gz /tmp/

RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc

RUN rm -rf /tmp/php-5.6.31* && yum clean all

WORKDIR /usr/local/php
EXPOSE 9000
CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]
2:构建镜像
Usage:  docker image build [OPTIONS] PATH | URL | -
Options:
-t, --tag list     # 镜像名称
-f, --file string  # 指定Dockerfile文件位置

示例:
docker build . 
docker build -t shykes/myapp .
docker build -t shykes/myapp -f /path/Dockerfile /path

扩展:解析搭建PHP的dockerfile文件内容

FROM centos:7
#FROM代表dockerfile使用哪个镜像文件,作为基础环境
	
MAINTAINER www.aliangedu.com
#MAINTAINER代表作者信息

RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
#RUN开头行表示在容器里执行什么命令

ADD php-5.6.31.tar.gz /tmp/
#ADD代表拷贝文件到哪个目录(等于cp命令)但是如果文件是压缩文件它会自动解压


RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
    
COPY php.ini /usr/local/php/etc
#COPY代表拷贝文件到哪个目录(等于cp命令)

RUN rm -rf /tmp/php-5.6.31* && yum clean all

WORKDIR /usr/local/php
#WORKDIR设定容器内的工作目录

EXPOSE 9000
#声明容器运行的端口

CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"]
#最后一个执行,通常作为最后一行,启动容器