目录
1.docker是容器的管理工具;
2.官方镜像:
docker search --filter "is-official-true" nginx
3.同一个镜像可以启动多个容器;
只要创建的时候,容器的名字不一样就可以;
4.容器先停掉再移出;
5.在容器中做的修改
退出容器(exit)后,停止,重启容器,修改的内容还会在;若把容器删除掉,修改内容就会消失;此时就需要docker commit -a "zh" -m "message" 容器名/容器ID 新容器名:版本号
6.容器通过镜像来创建的
7.docker run -itd
-d:表示后台运行容器,并返回容器ID
-i:表示以交互模式运行容器
-t:为容器重新分配
8.command是容器启动之后,要执行的命令;
9.给某镜像指定端口映射,并能够成功启动;
解决的是:客户端发来的请求与容器交互;
docker run -itd -p 8888:80 zh-nginx:1.0.0
10.文件挂载
docker run -itd --name=nginx -p 8888:80 -v /Users/liming/index.html:/usr/share/nginx/html/index.html nginx
将宿主机的文件挂载到容器中;在宿主机中进行文件的修改,容器中也会跟着修改;
将宿主机上的程序文件挂载到容器中,调用容器里的服务来运行;
解决的是:宿主机与容器间的交互;宿主机文件改动还是容器上的文件改动均会互相影响;
注意:宿主机和容器中的文件均需要填写全路径;
11.宿主机文件和容器文件进行交互复制
docker cp ...
12.容器互联
解决的是:容器间的交互
-e是:容器启动时会读取参数进行操作;
MySQL修改root密码:
alter user 'root'@'%' identified with mysql_native_password by '123456';
注意:mysql_native_password是数据库管理插件
docker run -itd --name=mysql -p 3306:3306 -v /Users/liming/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.27
用MySQL客户端sequel pro即可连上;
启动PHP容器,并关联MySQL:
docker run -tid --name=php --link mysql:mysql -v /Users/fdfd/index.php:/index.php php
--link 被关联的容器:被关联的容器别名;
进入php容器:执行php脚本,发现少driver,在容器中进行安装
安装php_mysql 至容器中,执行:
docker-php-ext-install pdo_mysql
PHP的脚本访问MySQL时,写容器关联的别名;因为IP地址不是固定的;
php脚本:
<?php
$pdo = new \PDO('mysql:host=mysql;dbname=test','root','lihuan1114');
foreach($pdo->query('SELECT * from user') as $row){
print_r($row);
}
13.如何通过Dockerfile定制镜像;
自制镜像;13之上都是下载docker上的镜像;
什么是Dockerfile?
Dockerfile:就是名为Dockerfile的文件,文件中包含一些Linux命令;docker通过读取Dockerfile文件中的命令来组件镜像;
Dockerfile文件中分为4部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行命令;
运行Dockerfile:
注意:tag_name可以不指定,即 docker build -t image_name . ,则默认生成lastest镜像;
docker build -t image_name:tag_name .
也可指定-f 参数来指定Dockerfile 文件位置;
docker build -f /path/Dockerfile .
命令详解:
FROM :指定基础镜像,必须是第一个命令;
MAINTAINER:可指定维护者信息,比如写自己的名字;
RUN:构建镜像时,执行的命令;(构建镜像时,docker在解析Dockerfile文件时)
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY:功能与ADD类似,但是是不能自动解压文件,也不能访问网络资源;
CMD:构建容器后调用,也就是容器启动时,才可以进行调用;(启动容器中的进程)(镜像构建完了,通过镜像启动容器时)
ENTRYPOINT:配置容器,使其可执行化,配置CMD可省去“application”,只使用参数;(docker run 命令后的启动完镜像,需执行的命令,不会把ENTRYPOINT设置的命令覆盖掉,而会把CMD设置的启动后执行的命令覆盖掉;另Dockerfile中只能允许有一个ENTRYPOINT命令,若ENTRYPOINT命令多的话,后面会覆盖前面的命令,即只会执行后面的ENTRYPOINT命令)
LABEL:用于给镜像添加元数据;(给镜像添加标识,比如版本号,描述等信息)
ENV:设置环境变量,即Linux中的环境变量;
EXPOST:指定于外界交互的端口;(即,容器对外暴露的端口)
VOLUME:用于指定持久化目录;(即进行文件目录的挂载)
WORKDIR:工作目录,类似于cd命令;(WORKDIR /path/to/workdir《==》RUN cd /usr/local/)
USER:指定运行容器时的用户名或UID,后续的RUN也会使用指定用户;若运行时,通过root 用户运行,即不用设置;
ARG:用于指定传递给构建运行时的变量;即,dockerfile中定义语法变量;
ONBUILD:用于设置镜像触发器;即当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被钥触发;
14.Dockerfile是分层的
运行Dockerfile文件时,可以看出来,标识为:Step 1/9;所以Dockerfile是分层的,不要一层写成多层;比如写了很多个RUN命令,不建议;
Dockerfile文件中要有层级,保持每一层的层级,比如RUN命令要执行多个,可以使用&&\来连接多行命令;
若之前执行过Dockerfile则执行时,每层下面会显示using cache,第一次执行 的时候,把每层进行了缓存;
FROM的内容,若本地有会直接用,若没有则会下载,不需提前准备基础镜像;
执行完Dockerfile文件后,就会生成image;