docker

第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包含:
在这里插入图片描述

第一章 需要了解的概念

  1. Docker:是开源的应用容器引擎,基于(Go语言)并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

  2. Docker容器优势

    • 启动快
    • 占用资源少
  3. 镜像:通过镜像创建容器

  4. 仓库:镜像的集中存放地

  5. 容器
    在这里插入图片描述

  6. 沙箱机制

    • 沙箱是一个虚拟系统程序,沙箱提供的环境相对于每一个运行的程序都是独立的,而且不会对现有的系统产生影响;
    • 沙箱具有非常良好的独立性、隔离性,所以能够搭建一些具有高风险的软件进行测试;
    • 在沙箱里面运行病毒可以说也是安全操作

第2章 基础操作 - 镜像

  1. 从仓库获取镜像
    搜索镜像: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
  2. 下载镜像:docker pull image_name
  3. 本地镜像的查看:docker images
  4. 本场镜像的删除: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章 基础操作 - 容器

  1. 创建容器:docker run -itd --name=container_name image_name
    • -i:表示以交互模式运行容器;
    • -d:表示后台运行容器,并返回容器ID;
    • -t:为容器重新分配一个伪输入终端;
    • --name:为容器指定名称
  2. 查看容器(运行中的):docker ps
  3. 查看容器(包括已停止的):docker ps -a`
  4. 停止容器:docker stop container_name/container_id
  5. 启动容器:docker start container_name/container_id
  6. 重启容器:docker restart container_name/container_id
  7. 删除容器: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

第四章 容器的修改及保存

  1. 进入容器:docker exec -it container_name/container_id /bin/bash
  2. 退出容器:exit
  3. 提交修改: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

第五章 容器进阶操作

  1. 端口映射:docker run -itd -p 宿主机端口号:容器端口号
    为何需要端口映射:客户端是直接与宿主机进行通信,而不是直接与容器进行通信,容器是与宿主机进行通信,所以需要端口映射。
    ———————————————————————————————————————————————
    | ——————————————— 宿主机 |
    | | 容器 | |
    80<————>80 | |
    | | | |
    | ——————————————— |
    ———————————————————————————————————————————————

  2. 文件挂载
    docker run -itd -v /宿主机/文件目录:/容器/目录

  3. 将容器的文件复制到本地
    docker cp 容器名: /宿主机/文件目录/文件名 /宿主机目录/文件名

  4. 将本地的文件复制到容器
    docker cp /宿主机目录/文件名 容器名: /宿主机/文件目录/文件名

  5. 容器互联
    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 命令详解

  1. FROM:指定基础镜像,必须为第一个命令

    1. 格式
    FROM <image>
    FROM <image>:<tag>
    FROM <image>@<digest>
    
    2.示例
    FROM centos:7.0 
    
  2. MAINTAINER:维护者信息

    1. 格式
    MAINTAINER <name>
    
    2. 示例
    MAINTAINER PanXiong
    
  3. RUN:构建镜像时执行的命令

    1. 格式  
    RUN <command> exec 执行
    RUN ["executable", "param1", "param2"]
    
    2. 示例
    RUN ["/bin/executable", "param1", "param2"]
    RUN yum install nginx
    
  4. 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/
    # 注:第一个参数指宿主机文件路径,第二个参数指容器路径
    
  5. COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

  6. 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用于指定镜像构建时所要执行的命令。
    
  7. 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'
    
  8. LABEL:用于为镜像添加元数据

    1. 格式
    LABEL <key>=<value> <key>=<value> ...
    
    2. 示例
    LABEL version="1.0" description="这是一个nginx镜像”
    
    注:使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过
    空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
    
  9. 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
    
  10. EXPOSE:指定于外界交互的端口

    1. 格式
    EXPOSE <port>[<port>...]
    
    2. 示例
    EXPOSE 80 443
    EXPOSE 8080
    
    注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些
    	端口,或通过-P参数来发布EXPOSE导出的所有端口
    
  11. VOLUME:用于指定持久化目录
    指定当前容器,哪些目录可以用于挂载

    1. 格式
    VOLUME ["path/to/dir"]
    
    2. 示例
    VOLUME ["/data/"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
    
    注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
    	1. 卷可以容器间共享和重用
    	2. 容器并不一定要和其它容器共享卷
    	3. 修改卷后会立即生效
    	4. 对卷的修改不会对镜像产生影响
    	5. 卷会一直存在,直到没有任何容器在使用它
    
  12. 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参数覆盖构建时所设置的工作目录`
  13. 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参数来覆盖所指定的用户。
    
  14. ARG:用于指定传递给构建运行时的变量
    Dockerfile文件里面的变量

    1. 格式
     ARG <name>[=<default value>]
    
    2. 示例
     ARG site
     ARG build_user=www
    
  15. 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
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考

源于视频:笔记视频

发布了140 篇原创文章 · 获赞 44 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章