1.安装docker

  1. 安装软件依赖添加软件源

    1. #安装必要的一些系统工具
    2. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    3. #添加软件源信息
    4. sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    5. #更新并安装Docker-CE
    6. sudo yum makecache fast
    7. sudo yum -y install docker-ce
    8. #开启Docker服务
    9. sudo service docker start
  2. 配置镜像加速:

    1. mkdir -p /etc/docker
    2. tee /etc/docker/daemon.json <<-'EOF'
    3. {
    4. "registry-mirrors": [https://i36t77on.mirror.aliyuncs.com]
    5. }
    6. EOF
    7. systemctl daemon-reload
    8. systemctl restart docker

    2. docker指令

    docker服务相关指令

  3. 启动,停止,重启,重载服务

    1. #启动服务
    2. systemctl start docker
    3. #停止服务
    4. systemctl stop docker
    5. #重启服务
    6. systemctl restart docker
    7. #重载服务
    8. systemctl daemon-reload

    docker镜像相关指令

  4. 查看本地镜像 ```bash docker images REPOSITORY TAG IMAGE ID CREATED SIZE

    镜像名称 #版本 #镜像ID #创建时间 #大小

    httpd latest b2c2ab6dcf2e 7 days ago 166MB

docker images -q #只查看镜像ID

docker images http #只查看http镜像

  1. 2. 搜索镜像
  2. ```bash
  3. docker search redis #搜索镜像
  4. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  5. #镜像名称 #描述信息 #喜欢点赞数量 #官方的 #自动构建
  6. redis Redis is an open source key-value store that… 8096 [OK]
  7. bitnami/redis Bitnami Redis Docker Image 143 [OK]
  1. 下载镜像到本地 ```bash docker pull nginx #将nginx镜像拉去到本地 Using default tag: latest #不加版本号,默认使用官方最新的

下载指定版本nginx,需要去官方网站查找指定版本

docker pull nginx:1.18.0

  1. 4. 删除镜像
  2. ```bash
  3. #使用image的ID删除
  4. docker rmi 602e111c06b6 #rm表示删除,i表示image。后面跟上image的ID
  5. Untagged: nginx:latest
  6. #使用image的版本号删除
  7. docker rmi nginx:1.17.0
  8. #删除所有的image
  9. docker rmi $(docker images -q) -f #将所有ID都传递给rmi,-f表示强制删除

docker容器相关指令

  1. 创建容器 ```bash 语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG…] OPTIONES: -d:后台运行容器(daemon) -i:以交互模式运行容器,退出后容器自动关闭(terminal interface) -t:为容器添加一个伪终端(terminal),与i一起使用 -p: 指定端口映射,格式为:主机端口:容器端口(port) —volume , -v: 绑定一个卷

example: docker run -it —name ‘centos7.1’ centos /bin/bash #创建容器并进入交互式终端 docker run -id —name ‘centos7.2’ centos #后台运行容器

  1. 2. 查看
  2. ```bash
  3. 语法:docker ps [OPTIONS]
  4. OPTIONS:
  5. -a:查看所有容器
  6. -q:只显示容器id
  7. -s:显示总的文件大小
  8. -n:列出最近创建的n个容器
  9. example:
  10. docker ps -n 1
  11. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  12. #容器ID #镜像名称 #运行容器需要的指令
  13. 4e8142ceae7b centos "/bin/bash" 4 minutes ago Up 4 minutes centos7.7
  1. 启动停止容器

    1. docker stop centos7.1
    2. docker start centos7.1
    3. docker restart centos7.1
  2. 删除容器 ```bash docker rm [OPTIONS] CONTAINER [CONTAINER…] OPTIONES: -f :通过 SIGKILL 信号强制删除一个运行中的容器。 -l :移除容器间的网络连接,而非容器本身。 -v :删除与容器关联的卷。

example: docker rm centos7.1

  1. 5. 对运行的容器执行指令
  2. ```bash
  3. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  4. OPTIONES:
  5. -d :分离模式: 在后台运行
  6. -i :即使没有附加也保持STDIN 打开
  7. -t :分配一个伪终端

3.docker数据卷

1. 数据卷概念

  1. 数据卷
    • 数据卷是宿主机的一个目录或文件
    • 当容器目录与数据卷目录绑定后,一方的修改会立即同步到另一方
    • 一个数据卷可以被多个容器同时挂载
    • 一个容器也可以挂载多个数据
  2. 数据卷作用

    • 容器数据持久化
    • 外部机器与容器通信
    • 容器之间数据交换

      2.配置数据卷

  3. 创建容器时,使用-v参数设置数据卷 ```shell 语法: docker run -v 宿主机PAHT:容器PATH

docker run -id -v /docker/c1/date/:/date —name ‘c1’ centos:7 #将本地目录与容器目录关联

example:

  1. #1. 在本机上创建文件,能映射到docker
  2. [root@docker date]# echo "hello world" > /docker/c1/date/a.txt
  3. [root@1935004b1a5f ~]# cat /date/a.txt
  4. hello world
  5. #2. 将docker删除,文件依然存在
  6. [root@docker date]# docker rm c1 -f
  7. [root@docker date]# cat a.txt
  8. hello world

注意:

  1. #1.关联目录必须使用绝对路径
  2. #2.可以挂在多个数据卷
  3. #3.可以挂在多个数据卷
  1. 2. 将一个数据卷挂载到两个容器,实现两个容器数据交换
  2. ```shell
  3. [root@docker ~]# docker run -id -v /docker/c1/date/:/date --name 'c1' centos:7
  4. [root@docker ~]# docker run -id -v /docker/c2/date/:/date --name 'c1' centos:7
  5. [root@docker ~]# docker exec -it c1 /bin/bash
  6. [root@2facb2656823 /]# echo "c1" > /date/a.txt
  7. [root@2facb2656823 /]# exit
  8. [root@docker ~]# docker exec -it c2 /bin/bash
  9. [root@b9fb9277ce20 /]# cat /date/a.txt
  10. c1

3.数据卷容器

  1. 将容器挂载到另一个容器

    1. #语法:docker run --volumes-from DOCER_NAME...
    2. example:
    3. #创建数据卷容器和测试文件
    4. [root@docker ~]# docker run -it -v /docker/date:/date --name c1 centos:7
    5. [root@b9fb9277ce20 /]# echo "docker" > /date/a.txt
    6. [root@b9fb9277ce20 /]#exit
    7. #将数据卷容器挂载到c1 c2
    8. [root@docker ~]# docker run -id -volumes-from --name c2 centos:7
    9. [root@docker ~]# docker run -id -volumes-from --name c3 centos:7
    10. #登录c1 c2查看
    11. [root@docker ~]# docker exec -it c2 /bin/bash
    12. [root@9bc91f37fac0 /]# cat /date/a.txt
    13. docker
    14. [root@docker ~]# docker exec -it c3 /bin/bash
    15. [root@3632825b36c8 /]# cat /date/a.txt
    16. docker

    4.docker应用部署

    1.MySQL部署

  2. 搜索拉取mysql

    1. [root@docker ~]# docker seach mysql
    2. [root@docker ~]# docker pull mysql:5.6
  3. 创建mysql容器 ```shell 1.创建映射目录 [root@docker ~]# mkdir /docker/mysql -pv

2.创建mysql容器 [root@docker mysql]# docker run -id -p 3306:3306 —name mysql \ -v /docker/mysql/conf:/etc/mysql/conf.d \ #配置文件路径 -v /docker/mysql/data:/var/lib/mysql \ #数据文件

  1. > -v /docker/mysql/log:/var/log/mysql/ \ #日志文件
  2. -e MYSQL_ROOT_PASSWORD=123456 \ #指定密码,注意不指定容器会起不来
  3. mysql:5.6 #镜像

3.进入容器,修改密码 [root@docker mysql]# docker exec -it mysql /bin/bash root@6db43377ab98:/# mysqladmin -uroot password ‘123456’

4.修改登录地址 mysql> update mysql.user set host=’%’ where user=’root’;

注意docker的端口映射是使用防火墙的nat,不能关闭防火墙

  1. 3. 远程主机连接
  2. ```shell
  3. [root@docker mysql]# mysql -uroot -p123456 -h192.168.10.101
  4. MySQL [(none)]> show databases;
  5. +--------------------+
  6. | Database |
  7. +--------------------+
  8. | information_schema |
  9. | mysql |
  10. | performance_schema |
  11. +--------------------+

2.tomcat部署

  1. 搜索拉取镜像

    1. [root@docker ~]# docker search tomcat
    2. [root@docker ~]# docker pull tomcat
  2. 创建容器

    1. [root@docker ~]# mkdir /docker/tomcat -p
    2. [root@docker ~]# docker run -id --name tomcat -p 8080:8080 -v /docker/tomcat/html:/usr/local/tomcat/webapps tomcat
  3. 配置网页文件

    1. root@eeb633798804:/usr/local/tomcat/# mkdir webapps/test
    2. root@eeb633798804:/usr/local/tomcat/# echo "hello docker tomcat" > index.html

    3.nginx部署

  4. 拉去镜像

    1. [root@docker ~]# docker search nginx
    2. [root@docker ~]# docker pull nginx
  5. 创建容器 ```shell

    创建主配置文件

    [root@docker ~]# mkdir /docker/nginx/ [root@docker ~]# vim nginx.conf

创建容器

[root@docker ~]# docker run -id —name nginx \ -v /docker/nginx/nginx.conf:/etc/nginx/nginx.conf \ #映射主配置文件,注意主配置文件需要事先创建 -v /docker/nginx/logs:/var/log/nginx \ #日志文件
-v /docker/nginx/html:/usr/share/nginx/html \ #网页文件 -p 80:80 nginx

  1. 3. 创建网页文件
  2. ```shell
  3. [root@docker ~]# vim /docker/nginx/nginx.conf #添加一段配置
  4. server {
  5. listen 80;
  6. server_name _;
  7. location / {
  8. root /usr/share/nginx/html;
  9. index index.html index.htm;
  10. }
  11. }
  12. [root@docker ~]# echo "nginx" > /docker/nginx/html/index.html

4.redis部署

  1. 拉取redis镜像

    1. [root@docker html]# docker search redis
    2. [root@docker html]# docker pull redis
  2. 创建容器

    1. [root@docker html]# docker run -id -v /docker/redis/date:/date --name redis -p 6379:6379 redis

    5.Dockerfile

    1.Docker镜像原理

  3. linux文件系是由bootfs和rootfs组成
    bootfs:包含bootloader和kernel
    rootfs:root文件系统,典型的目录结构

  4. dokcer镜像原理
    1. docker是由特殊的文件系统叠加而成的
    2. docker最底端是bootfs,而且它是复用宿主机的bootfs
    3. 第二层是rootfs,基础镜像,也就是我们的centos镜像,Ubuntu镜像
    4. 往上可以叠加更多的镜像文件,也就是应用软件
    5. 当容器启动时,docker会在最顶层加载一个读写文件系统作为容器;也就是可以生成新的镜像
  5. 总结 ```shell
  6. centos镜像小,因为它会复用宿主机bootfs

  7. tomcat镜像比centos镜像大得多,因为他需要centos+jdk+tomcat,多层叠加 ```

    2.镜像制作

  8. 容器转为镜像 ```shell docker commit 容器ID 新的镜像名:版本号 #制作新的镜像

docker save -o 压缩文件名 IMAGE_NAME:版本号 #压缩镜像

docker load -i 压缩文件名 #解压镜像

exmaple:将tomcat镜像修改,并且制作成新的镜像 1.创建一个镜像 [root@docker ~]# docker run-id -p 8080:8080 —name tomcat \ -v /docker/tomcat/html/:/usr/local/tomcat/webapps tomcat 创建tomcat容器
[root@docker docker]# docker exec -it tomcat bash #进入容器

  1. 2.创建测试文件
  2. root@d866d:tomcat# echo “hello” > ./webapps/test/index.html #创建网页文件,这是挂载到本地目录的
  3. root@d866d3f86371:tomcat# echo “root” > /root/a.txt #这是容器里面的
  4. 3.生成一个新的镜像
  5. [root@docker ~]# docker commit d866 tomcat_test:1.0
  6. [root@docker ~]# docker images
  7. REPOSITORY TAG IMAGE ID CREATED SIZE
  8. tomcat_test 1.0 b68698594b62 2 minutes ago 647MB
  9. 4.压缩解压镜像
  10. [root@docker ~]# docker save -o tomcat_test.tar tomcat_test:1.0
  11. [root@docker ~]# docker rmi tomcat_test:1.0 #删除镜像
  12. [root@docker ~]# docker load -i tomcat_test.tar #解压镜像
  13. 5.使用新的镜像生产容器
  14. [root@docker ~]# docker run -id --name tomcat tomcat_test:1.0
  15. [root@docker ~]# docker exec -it tomcat bash
  16. 6.验证
  17. root@74e:/usr/local/tomcat# ls /root/
  18. a.txt
  19. root@74:/usr/local/tomcat# ls webapps/
  20. 7.总结
  21. 挂载目录中的文件,不会随容器一起被制作成镜像,而容器里面创建的文件可以
  1. <a name="22d08831"></a>
  2. #### 3.Dockerfile制作镜像
  3. 1. Dockerfile概念
  4. 1. Dockerfile是一个文本文件
  5. 1. 包含了一条一条的指令
  6. 1. 每一个指令构建一层,基于基础镜像,最终构建一个新的镜像
  7. 1. 对于开发人员,可以为开发团队提供一个完全一致的开发环境
  8. 2. Dockerfile关键字
  9. | 关键字 | 作用 | 备注 |
  10. | :---: | :---: | :---: |
  11. | FROM | 指定父镜像 | 指定Dockerfile基于那个image构建 |
  12. | MAINTAINER | 作者信息 | 用来表明docker是谁写的 |
  13. | LABEL | 标签 | 用来标明dockerfile的标签,可以使用label代替Maintainer,最红都是在docker image中查看 |
  14. | RUN | 执行命令 | 执行一段指令,默认是bash格式,RUN command |
  15. | CMD | 容器启动指令 | 提供启动容器时候的默认命令和ENTRYPOINT配合使用,CMD command param1 param2 |
  16. | ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
  17. | COPY | 复制文件 | build的时候复制文件到image中 |
  18. | ADD | 添加文件 | build的时候添加文件到image中,不仅仅局限于当前build上下文,可来源于远程服务 |
  19. | ENV | 环境变量 | 指定build时的环境变量,可以在启动容器的时候,通过-e覆盖,ENV name=value |
  20. | ARG | 构建参数 | 只在构建参数时使用的参数,如果与ENV相同则被ENV负载 |
  21. | VOLUME | 定义外部可以挂载的数据卷 | 指定build的image哪些目录可以启动的时候挂载到文件系统中,启动容器的时候使用 -v绑定 |
  22. | EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口,启动容器时使用-p绑定暴露的端口 EXPOSE 8080/tcp |
  23. | WORDDIR | 工作目录 | 指定容器内部的工作目录 |
  24. | USER | 指定执行用户 | 指定build或启动的时候,在RUN CMD ENTRYPOINT执行的时候的用户 |
  25. | HEALTHCHECK | 健康检查 | 检测当前容器健康 |
  26. | ONBUILD | 触发器 | 当存在ONBULID关键字的镜像作为基础镜像的时候,放当FROM完成之后,会触发 |
  27. | STOPSIGNAL | 发送信号到宿主主机 | 该STOPSINGNAL指令设置将发送到容器的系统调用信号以退出 |
  28. | SHELL | 执行脚本 | 指定RUN CMD ENTERYPOINT 执行命令的时候 使用的shell |
  29. | | | |
  30. 3. Dockerfile实战
  31. ```shell
  32. #需求:自定义Centos7镜像,默认路径为/usr/ 可以使用vim指令
  33. FROM centos:7 #定义父镜像
  34. MAINTAINER #定义作者信息
  35. RUN yum intsall -y vim #安装vim
  36. WORKDIR /usr #指定默认工作目录
  37. CMD /bin/bash #容器启动时执行的命令
  38. 1.#定义dockerfile
  39. [root@docker dockerfile]# vim centos_vim.df
  40. FROM centos:7
  41. MAINTAINER
  42. RUN yum intsall -y vim
  43. WORKDIR /usr
  44. CMD /bin/bash
  45. 2.#创建自定义镜像
  46. [root@docker dockerfile]# docker build -f ./centos_vim.df -t vim_centos:1 .
  47. [root@docker dockerfile]# docker images
  48. REPOSITORY TAG IMAGE ID CREATED SIZE
  49. vim_centos 1 851463a1038b 17 seconds ago 323MB
  50. 3.#使用自定义镜像创建文件
  51. [root@docker ~]# docker run -it --name c1 vim_centos:1
  52. [root@2b0820d547c8 usr]# which vim
  53. /usr/bin/vim

6.Docker Compose

1.服务编排

  1. 微服务架构的应用系统中一般都包含若干个微服务,每个微服务部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
  • 从docker hub拉取镜像
  • 创建多个container
  • 管理多个container

    2.Docker Compose简介

  1. Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动停止。
  • 利用dockerfile定义运行环境(镜像)
  • 使用docker-compose.yml定义组成应用的各服务
  • 运行docker-compose up启动应用

    3.Docker Compose安装

  1. docker-compose在epel仓库中

    1. [root@docker ~]# yum install -y docker-compose

    4.Docker Compose实战

  2. 需求,使用docker compose搭建lamp+wordpress环境

  3. 软件版本httpd2.4 PHP5.4 MySQL5.6
  4. 编写lamp.yaml
    1. [root@docker docker-compose]# vim lamp.yml

    7.Docker私有仓库

    1.私有仓库搭建

  1. # 1.拉去私有仓库镜像
  2. docker pull registry
  3. # 2.创建私有仓库容器
  4. docker run -id --name registry -p 5000:5000 registry
  5. # 3.浏览器访问http://192.168.10.101:5000/v2/_catalog
  6. # 4.修改daemon.json,让docker信任私有仓库
  7. vim /etc/daemon.json
  8. "insecure-registries": ["192.168.10.101:5000"] #这一步配置在客户端,使docker信任这个私有docker仓库
  9. # 5.重启docker服务
  10. systemctl restart docker
  11. docker start registry #启动私有仓库
  12. #注意:json语法格式,每一个key:value要使用‘.’逗号

2.将镜像上传至私有仓库

  1. # 1.将需要上传的镜像打tag
  2. docker tag nginx 192.168.10.101:5000/nginx
  3. # 2.上传镜像
  4. docker push 192.168.10.101:5000/nginx

3.从私有仓库拉去镜像

  1. # 拉取镜像
  2. docker pull 192.168.10.101:5000/nginx