第0章 环境与安装
1. 环境:Mac OS
安装:brew cask install docker
2. 环境:CentOS
# 1. 安装相关系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 2. 添加yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 更新yum缓存
sudo yum makecache fast
# 4. 安装
sudo yum -y install docker-ce
# 5. 启动
sudo systemctl start docker
# 6. 查看docker操作命令
docker
3. windows
安装docker toolbox:下载地址
docker toolbox包含:
第一章 需要了解的概念
-
Docker
:是开源的应用容器引擎,基于(Go语言
)并遵从Apache2.0协议开源。Docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器
中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器
是完全使用沙箱机制
,相互之间不会有任何接口,更重要的是容器性能开销极低。 -
Docker容器优势
- 启动快
- 占用资源少
-
镜像
:通过镜像创建容器 -
仓库
:镜像的集中存放地 -
容器
:
-
沙箱机制
- 沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响;
- 沙箱具有非常良好的独立性、隔离性,所以能够搭建一些具有高风险的软件进行测试;
- 在沙箱里面运行病毒可以说也是安全操作
第2章 基础操作 - 镜像
- 从仓库获取镜像
搜索镜像:docker search image_name
搜索结果过滤:- 是否是官方:
docker search --filter "is-official=true" image_name
- 是否是自动化构建:
docker search --filter "is-automated=true" image_name
- 大于多少颗星:
docker search --filter stars=3 image_name
- 是否是官方:
- 下载镜像:
docker pull image_name
- 本地镜像的查看:
docker images
- 本场镜像的删除:
docker rmi image_name
# 以nginx为例
# 1. 搜索镜像
docker search nginx
# 1.1 结果过滤-是否是官方
docker search --filter "is-official=true" nginx
# 1.2 结果过滤-是否是自动化构建
docker search --filter "is-automated=true" nginx
# 1.3 结果过滤-大于等于3颗星
docker search --filter stars=3 nginx
# 2. 下载镜像
docker pull nginx
# 3. 本地镜像的查看
docker images
# 4. 本场镜像的删除
docker rmi nginx
第3章 基础操作 - 容器
- 创建容器:
docker run -itd --name=container_name image_name
- -i:表示以交互模式运行容器;
- -d:表示后台运行容器,并返回容器ID;
- -t:为容器重新分配一个伪输入终端;
- --name:为容器指定名称
- 查看容器(运行中的):
docker ps
- 查看容器(包括已停止的):docker ps -a`
- 停止容器:
docker stop container_name/container_id
- 启动容器:
docker start container_name/container_id
- 重启容器:
docker restart container_name/container_id
- 删除容器:
docker rm container_name/container_id
# 以nginx为例
# 1.创建一个容器
docker run -itd --name=nginx nginx
# 2. 查看运行的容器
docker ps
# 3. 查看所有的容器
docker ps -a
# 4. 启动容器
docker start nginx
# 5. 重启容器
docker restart nginx
# 6. 停止容器
docker stop nginx
# 7. 删除容器
docker rm nginx
第四章 容器的修改及保存
- 进入容器:
docker exec -it container_name/container_id /bin/bash
- 退出容器:
exit
- 提交修改:
docker commit -a "author" -m "message" container_name/container_id new_image_name:tag_name
- -a:参数可选,用于指定作者
- -m:参数可选,提交信息,可以说明一下做了哪些修改
- container_name/container_id:被修改容器的容器名和ID,只用写一个就可以
- new_image_name:此为新镜像的名字,可自定义
- tag_name:引为新镜像的标签,可不写,不写时默认为latest
# 以nginx为例
# 1. 进入nginx容器
docker exec -it nginx /bin/bash
# 2. 修改容器,增加一个目录或文件后,退出
exit
# 3. 提交修改,生成新的镜像
docker commit -a "px" -m "test_add_dir" nginx new_nginx
第五章 容器进阶操作
-
端口映射:docker run -itd -p 宿主机端口号:容器端口号
为何需要端口映射:客户端是直接与宿主机进行通信,而不是直接与容器进行通信,容器是与宿主机进行通信,所以需要端口映射。
———————————————————————————————————————————————
| ——————————————— 宿主机 |
| | 容器 | |
80<————>80 | |
| | | |
| ——————————————— |
——————————————————————————————————————————————— -
文件挂载
docker run -itd -v /宿主机/文件目录:/容器/目录 -
将容器的文件复制到本地
docker cp 容器名: /宿主机/文件目录/文件名 /宿主机目录/文件名 -
将本地的文件复制到容器
docker cp /宿主机目录/文件名 容器名: /宿主机/文件目录/文件名 -
容器互联
docker run -itd --link 要关联的容器的容器名字:容器在被关联的容器中的别名
# 以nginx为例
1. 端口映射:宿主机8888端口映射到容器的80端口
docker run -itd --name=nginx -p 8888:80
2.将宿主机的 /User/panxiong/course/index.html文件挂载到容器的/usr/share/nginx/html/index.html
# 注:宿主机中修改index.html,容器中的对应的index.html也会修改
# 容器对index.html修改,本地对应的index.html也会修改
docker run -itd --name=nginx -v /User/panxiong/course/index.html:/usr/share/nginx/html/index.html
3. 将容器的文件复制到本地
docker cp nginx:/etc/nginx/conf.d/default.conf /Users/panxiong/course/default.conf
4. 将本地的文件复制到容器的根目录下
docker cp /Users/panxiong/course/default.conf nginx:/default.conf
5. 容器互联,以mysql和php为例
5.1 启动mysql容器
docker run -itd --name=mysql -p 33066:3306 -v /Users/panxiong/course/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 mysql
# -e:启动容器的时候,往里面传递参数,设置root密码
5.2 进入mysql容器,修改root密码
docker exec -it mysql /bin/bash
mysql -uroot -p
# 修改mysql密码,修改root任意连接地址的密码为123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
exit
5.3 在本地连接容器的数据库,添加一些数据
5.4 启动php容器
创建一个index.php
<?php
pdo = new \PDO('mysql:host=mysql;dbname=test','root', '123456');
foreach($pdo->query('SELECT * from user) as $row)
print_r($row);
}
docker run -itd --name=php --link mysql:mysql -v /Users/panxiong/course/php/index.php:/index.php
5.5 进入php容器
docker exec -it php /bin/bash
5.6 安装pdo_mysql
docker-php-ext-install pdo_mysql
5.7 执行php index.php
修改mysql密码,修改root任意连接地址的密码为123456
ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_ password BY ‘123456’;
第六章 Dockerfile
6.1 Dockerfile简介
Dockerfile
就是名为Dockerfile
的文件,文件中包含一些Linux命令,Docker
通过读取文件中的命令来组建镜像。Dockerfile文件内容结构分四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行指令
1. 运行Dockerfile
docker build -t image_name:tag_name .
2 通过-f参数来指定Dockerfile文件位置
docker build -f /path/Dockerfile .
6.2 命令详解
-
FROM
:指定基础镜像,必须为第一个命令1. 格式 FROM <image> FROM <image>:<tag> FROM <image>@<digest> 2.示例 FROM centos:7.0
-
MAINTAINER
:维护者信息1. 格式 MAINTAINER <name> 2. 示例 MAINTAINER PanXiong
-
RUN
:构建镜像时执行的命令1. 格式 RUN <command> exec 执行 RUN ["executable", "param1", "param2"] 2. 示例 RUN ["/bin/executable", "param1", "param2"] RUN yum install nginx
-
ADD
:将本地文件添加到容器中tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget 1. 格式 ADD <src> <dest> ADD ["<src>",... "<dest>"] # 用于支持包含空格的路径 2. 示例 ADD tes* /mydir/ # 添加所有以“tes"开头的文件 ADD tes?.txt /mydir/ # ? 替代一个单字符,例如:"test.txt" ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/ # 注:第一个参数指宿主机文件路径,第二个参数指容器路径
-
COPY
:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源 -
CMD
:构建容器后调用,也就是在容器启动时才进行调用1. 格式 CMD ["executable", "param1", "param2"] # 执行可执行文件, 优先 CMD ["param1", "param2"] # (设置了ENTRYPOINT, 则直接调用ENTRY添加参数) CMD command param1 param2 # (执行shell内部命令) 2. 示例 CMD echo "This is a test" | wc - CMD ["/usr/bin/wc", "--help"] 注:CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
-
ENTRYPOINT
:配置容器,使其可执行化。配合CMD可省去“application”,只使用参数1. 格式 ENTRYPOINT ["executable", "param1", "param2"] # (可执行文件,优先) ENTRYPOINT command param1 param2 # (shell 内部命令) 2. 示例: FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"] 注:ENTRYPOINT与CMD非常类似,不同提通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run 命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT,Dockerifle中只允许有一个ENTRYPOINT命 令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。 docker run -itd --name=nginx nginx echo 'hello world'
-
LABEL
:用于为镜像添加元数据1. 格式 LABEL <key>=<value> <key>=<value> ... 2. 示例 LABEL version="1.0" description="这是一个nginx镜像” 注:使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过 空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
-
ENV
:设置环境变量1. 格式 ENV <key> <value> 之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量 ENV <key>=<value> <key>=<value> ...可以设置多个变量,每个变量为一个“<key>=<value>”的键值对, 如果<key>中包含空格,可以使用\来进行转义,也可以通过“”来进行标示; 另外,反斜线也可以用于续行。 2. 示例 EVN myName John Doe EVN myDog Rex The Dog EVN myCat=fluffy
-
EXPOSE
:指定于外界交互的端口1. 格式 EXPOSE <port>[<port>...] 2. 示例 EXPOSE 80 443 EXPOSE 8080 注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些 端口,或通过-P参数来发布EXPOSE导出的所有端口
-
VOLUME
:用于指定持久化目录
指定当前容器,哪些目录可以用于挂载1. 格式 VOLUME ["path/to/dir"] 2. 示例 VOLUME ["/data/"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] 注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能: 1. 卷可以容器间共享和重用 2. 容器并不一定要和其它容器共享卷 3. 修改卷后会立即生效 4. 对卷的修改不会对镜像产生影响 5. 卷会一直存在,直到没有任何容器在使用它
-
WORKDIR
:工作目录,类似于cd命令1. 格式 WORKDIR /path/to/workdir 2. 示例 WORKDIR /usr/local/ (这时工作目录为/usr/local/) WORKDIR nginx (这时工作目录为/usr/local/nginx) WORKDIR sbin (这时工作目录为/usr/local/nginx/sbin) 注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令 都会在该目录下执行。在使用docker run运行容器时,可以通过`-w参数覆盖构建时所设置的工作目录`。
-
USER
:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户
使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户1. 格式 USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group 2. 示例 USER www 注:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。 镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
-
ARG
:用于指定传递给构建运行时的变量
Dockerfile文件里面的变量1. 格式 ARG <name>[=<default value>] 2. 示例 ARG site ARG build_user=www
-
ONBUILD
:用于设置镜像触发器1. 格式 ONBUILD [INSTRUCTION] 2. 示例 ONBUILD [INSTRUCTION] ONBUILD RUN /usr/local/bin/python-build --dir /app/src 注:当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
6.3 完整Dockerfile例子
FROM registry.cn-hangzhou.aliyuncs.com/xwjs/centos7
MAINTAINER PanXiong
# Yum
RUN yum -y update && \
yum install -y pcre pcre-devel zlib openssl openssl-devel && \
yum clean all
ARG NGINX_VERSION=1.15.0
#Nginx
WORKDIR /tmp
RUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
tar xzf nginx-${NGINX_VERSION}.tar.gz && \
cd /tmp/nginx-${NGINX_VERSION}.tar.gz && \
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-debug && \
make && \
make install
# 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
# 开放端口
EXPOSE 80 443
# 执行命令
ENTRYPOINT ["nginx", "-g", "daemon off;"]
第七章搭建PHP开发环境
还未整理。。。
启动mysql
启动php
启动nginx
参考
源于视频:笔记视频