一:基础环境搭建
下面的内容系统版本都是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
2:查看虚拟机的状态
docker ps
3:查看docker虚拟机的ip
docker inspect 7b37ffc9ec34
解析:docker inspect 虚拟机ID(使用docker ps查看的CONTAINER ID 列)
4:连接docker容器
docker exec -it 7b37ffc9ec34 bash
解析:docker exec -it 虚拟机的ID bash
三:镜像的管理
简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。
1:配置国内的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镜像默认存储在/var/lib/docker/overlay2中。
容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。
Docker使用存储驱动管理镜像每层内容及可读写层的容器层
docker history nginx:1.12
解析:nginx:1,12 指定查看的镜像加具体的版本信息(只能查看本地已缓存的镜像文件)
5:docker支持的驱动
四:镜像管理命令
1:拉取镜像
docker pull nginx:1.12
解析:冒号后面加上版本号,不加默认下最新版本
2:查看现有镜像
docker images
3:删除镜像
docker mage rm 镜像:标签
docker rmi 镜像:标签
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
解析:后面可跟容器名查看指定的容器资源使用
5:查看容器的详细信息
docker inspect nginx1
6:查看运行的容器的进程
docker top nginx1
7:将导出的容器提交为一个镜像
docker commit a1 a1:20
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
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网桥,默认创建的容器也是添加到这个网桥中。
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指令
扩展:创建搭建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"]
#最后一个执行,通常作为最后一行,启动容器