学习中的疑问:

原来针对某应用的各种配置,如何实现?比如nginx有各种细节配置,使用docker之后怎么实现这些配置?

解决的问题

  • dev环境和线上环境不一致的问题
  • 环境配置重复部署的问题(docker可以将项目与环境一起打包)

    常用命令

    run的参数可以参考:docker run 参数

    1. # 批量删除所有镜像(删除容器同理,-q表示简洁打印,只打印对应的id)
    2. docker rmi -f $(docker images -aq)
    3. 或者:
    4. docker images -ap|xargs docker rmi -f
    5. # 修改tag信息
    6. docker tag <old_image_name:tag> <new_image_name:tag>
    7. # 以交互的方式启动镜像
    8. ## append_command表示容器启动后,在容器中执行的一条命令,只能有一条
    9. docker run -it <image_name> <append_command>
    10. # 以“用完即删”的方式启动镜像
    11. docker run --rm <image_name>
    12. # 指定映射,前面的表示外面的
    13. docker run -p <out_port>:<in_port> <image_name>
    14. # 修改容器名称
    15. docker rename <old_name> <new_name>
    16. # 打印日志
    17. -f:滚动显示
    18. -t:时间戳
    19. docker logs -ft --tail <要显示的日志条数>
    20. # 查看容器中的进程信息
    21. docker top <container_name>
    22. # 进入运行中的容器
    23. ## 开启一个新的bash:
    24. docker exec -it <container_name> /bin/bash
    25. ## 进入正在运行bash
    26. docker attach <container_name>
    27. # 退出容器
    28. ## 关闭正在运行的终端
    29. exit
    30. ## 不关闭正在运行的终端
    31. ctrl+p然后ctrl+q
    32. # 查看容器信息
    33. docker inspect <container_name>
    34. # 拷贝文件到宿主机
    35. docker cp <container_name>:/home/demo.txt /home/demo.txt
    36. # 提交容器为一个新的副本(相当于创建了一个快照)
    37. docker commit -m="提交的信息" -a="作者" <容器id或者容器名称> <目标镜像名称>:<tags>
    38. # 挂载数据卷(如果主机目录或者容器内目录不存在,则创建该目录)
    39. ## 数据卷名称为可选,不能以‘/’开始!如果不指定,docker会随机分配一个名称
    40. ## 主机目录可选,如果不指定,将由docker管理映射路径(默认在/var/lib/docker/volumns目录下)
    41. ## ro表示内部只读(只能由容器外写入),rw表示可写,可选
    42. docker run -it -v <数据卷名称>:<主机目录>:<容器目录>:<ro或者rw>
    43. # 查看数据卷详情
    44. docker volumn inspect <数据卷名称>
    45. # 查看镜像的构建历史
    46. docker history <image_name>
    47. # 共享其他容器的数据卷(该操作将使得容器2创建和容器1相同的数据卷)
    48. docker --volumes-from <another_container>
    49. # 登录并且提交镜像
    50. docker login -u <username>
    51. docker push <image_name>

    dockerfile

    构建命令

    1. docker build -f <dockerfile的路径> -t <构建后的镜像名称>:<tag> <构建使用到的目录>
    2. ## 示范
    3. docker buile -f dockerfile -t jacketzc/centos .

    dockerfile脚本

    格式:

    1. # Comment
    2. INSTRUCTION arguments

    说明:

  • 每一行指令docker都会尽可能为其构建一层镜像

    • 也就是说上一行执行的 cd /home在下一行没有作用
  • 指令不区分大小写,但是建议大写便于区分参数

基本指令:

  1. FROM # 构建镜像所依赖的镜像
  2. # 示范:FROM centos:7.0
  3. MAINTAINER # 维护者信息
  4. #示范:
  5. MAINTAINER jacketzc<jacketzc@outlook.com>
  6. ENV # 定义环境变量(相当于-e)
  7. # 示范:
  8. ENV abc=hello
  9. WORKDIR ${abc}
  10. # 变量在同一行具有唯一值
  11. # 可以通过此命令在系统环境中追加环境:(此处以配置jdk的环境变量作为示范 )
  12. ENV PATH $PATH:$JAVA_HOME/bin
  13. RUN # 构建镜像的时候所需要执行的命令
  14. # 示范:
  15. RUN yum -y install net-tools
  16. ADD # 构建镜像时,所使用到的本地资源
  17. # 示范:将构建目录的压缩包解压到镜像对应的目录中
  18. ADD jdk-8-tar.gz /usr/local
  19. # ADD 会自动解压压缩包
  20. WORKDIR # 运行容器后,默认进入的目录
  21. VOLUMN # 指定挂载的目录(相当于-v)
  22. EXPOSE # 指定暴露的端口(相当于-p)
  23. CMD # 相当于run镜像时的附加命令,只有最后一个CMD会生效
  24. # 示范:
  25. CMD /bin/bash
  26. ENTRYPOINT # 追加命令,所有命令都会拼接在该命令之后
  27. # 示范:
  28. ENTRYPOINT ["ls", "-a"]
  29. 此时run该镜像时如果附加命令-l,那么相当于执行了ls -a -l
  30. ONBUILD #
  31. COPY # 类似ADD,将文件拷贝到镜像中
  32. # 示范:将构建目录的文件拷贝到镜像对应的目录中
  33. cp readme.txt /usr/local

docker网络

  • 桥接模式:就是默认模式,docker会给容器创建一个虚拟网卡、分配一个ip,主机与容器可以相互ping,容器之间也可以相互ping(通过veth-pair技术相连)

    • veth-pair为每个可以通信的容器创造一对网卡,在容器外创建的一个虚拟网卡与容器内部的网卡相连,示意:image.png

      安装各种环境

      安装mysql

  • 默认配置文件目录为:/etc/mysql/conf.d

  • 数据文件目录为:/var/lib/mysql

    1. docker pull mysql:5.7
    2. # 简单启动
    3. docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
    4. # 映射配置文件目录以及数据文件目录
    5. docker run -d -p 3310:3306 --name mysql01 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

    构建jdk、tomcat环境

  • 准备一个目录,其中包含:

    • linux版本的jdk压缩包
    • tomcat压缩包
    • DockerFile
    • readme.txt
  • DockerFile参考: ```dockerfile FROM centos

    MAINTAINER 已被弃用,建议使用LABEL为镜像设置meta信息

    MAINTAINER jacketzcjacketzc@outlook.com

    LABEL MAINTAINER=”jacketzcjacketzc@outlook.com

COPY readme.txt /home/ ADD jdk-8u281-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.61.tar.gz /usr/local

RUN yum -y install nano

ENV mypath /usr/local WORKDIR $mypath ENV JAVA_HOME /usr/local/jdk1.8.0_281 ENV CLASSPATH . ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.61 ENV CATALINA_BASH apache-tomcat-8.5.61 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib

EXPOSE 8080

CMD /usr/local/apache-tomcat-8.5.61/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.61/logs/catalina.out

  1. <a name="zgLLQ"></a>
  2. ### 构建jenkins+node+maven环境镜像
  3. ```dockerfile
  4. FROM jenkins
  5. LABEL MAINTAINER="jacketzc<jacketzc@outlook.com>"
  6. # if we want to install via apt
  7. USER root
  8. # USER jenkins # drop back to the regular jenkins user - good practice
  9. ADD node-v14.16.1-linux-x64.tar /usr/local
  10. ADD apache-maven-3.5.2-bin.tar.gz /usr/local
  11. COPY sources.list /etc/apt/
  12. ENV mypath /usr/local
  13. WORKDIR ${mypath}
  14. ENV MAVEN_HOME /usr/local/apache-maven-3.5.2/
  15. ENV NODE_HOME /usr/local/node-v14.16.1-linux-x64/
  16. ENV PATH $PATH:${MAVEN_HOME}/bin:${NODE_HOME}/bin
  17. # RUN apt-get update \
  18. # && apt install -y nano \
  19. RUN ln -s /usr/local/node-v14.16.1-linux-x64/bin/npm /usr/bin/npm \
  20. && ln -s /usr/local/node-v14.16.1-linux-x64/bin/node /usr/bin/node \
  21. && npm config set registry https://registry.npm.taobao.org

构建ELK

  1. # 先创建一个ELK共享的网络
  2. docker network create ELK
  3. # 开启ES(单机模式)
  4. docker run -d --name elasticsearch --net ELK -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.4
  5. # 开启kibana
  6. docker run -d --name kibana --net ELK -p 5601:5601 kibana:7.17.4

安装minio

minio的集群并不需要额外的配置文件

  1. # 单机
  2. # server /data表示数据存储的位置 {1...2}会创建/data1、/data2来存储数据,如果需要持久化,用-v将这些目录映射
  3. # --console-address表示指定一个控制台的端口,需要使用-p暴露该端口,该端口不能和api的一样
  4. docker run -d \
  5. -p 9000:9000 \
  6. -p 9001:9001 \
  7. --name minio1 \
  8. -v /home/minio/data/update:/data1 \
  9. -v /home/minio/data/backup:/data2 \
  10. -e "MINIO_ROOT_USER=admin" \
  11. -e "MINIO_ROOT_PASSWORD=admin123" \
  12. minio/minio server /data{1...2} --console-address ":9001"
  13. # 集群

日常

修改容器内的配置文件

场景:容器没有提供文本编辑器,但是还是要修改
思路:把容器中的配置文件复制出来,修改后再复制进去

  1. # 复制
  2. docker cp mysql:/etc/mysql/my.cnf /usr/local/mysql/my.cnf
  3. # 修改后替换
  4. docker cp /usr/local/mysql/my.cnf mysql:/etc/mysql/my.cnf

将镜像导出/导入

  1. # 导出
  2. docker save <image_name> <xxx.tar>
  3. # 导入
  4. docker load< <xxx.tar>