Docker学习

本文详细介绍了如何使用Dockerfile从基础镜像构建定制化的Docker镜像,包括常用指令的解释与示例,如FROM、RUN、CMD等。同时,讲解了镜像的构建、测试、打包及推送至私有仓库的全过程。

docker

基于基础镜像构建自己的镜像

  • 编写Dockerfile
指令描述
FROM构建的新镜像是基于哪个镜像。例如:FROM centos:6
MAINTAINER镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen
RUN构建镜像时运行的Shell命令。例如:RUN [“yum”,“install”,“httpd”],或者RUN yum install httpd
CMD运行容器时执行的Shell命令(可以被运行时传递的参数覆盖)。例如:CMD ["-c","/start.sh"], 或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
EXPOSE声明容器运行的服务端口。例如:EXPOSE 80 443
ENV设置容器内环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456
ADD拷贝文件或目录到镜像(可以自动解压缩或者下载) 例如:ADD [“src”,“dest”]或者ADD https://xxx.com/html.tar.gz/var/www/html, 或者:ADD html.tar.gz /var/www/html
COPY拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
ENTRYPOINT运行容器时执行的Shell命令(不能被运行时传递的参数覆盖)。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"], 或者ENTRYPOINT /bin/bash -c “/start.sh”
VOLUME指定容器挂载点到宿主机自动生成的目录或其他容器, 例如:VOLUME ["/var/lib/mysql"]
USER为RUN,CMD和ENTRYPOINT执行命令指定运行用户, 例如:USER Mr_chen
WORKDIR为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。 例如:WORKDIR /data
HEALTHCHECK健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost/
ARG在构建镜像时指定一些参数。例如:ARG user
# from为基础镜像
from centos
# 作者信息
MAINTAINER cheers0606 <cheers0606520@gmail.com>

ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
# ENV LC_ALL en_US.UTF-8

ADD jdk-8u221-linux-x64.tar.gz /usr/local/
ADD apache-maven-3.6.1-bin.tar.gz /usr/local/

RUN ln -s /usr/local/jdk1.8.0_221 /usr/local/jdk
RUN ln -s /usr/local/apache-maven-3.6.1 /usr/local/maven

ADD settings.xml /usr/local/maven/conf/

# 放置源码
RUN mkdir /code
# ADD code /code

ENV JAVA_HOME /usr/local/jdk
ENV MVN_HOME /usr/local/maven

ENV path $path:${JAVA_HOME}/bin:${MVN_HOME}/bin

RUN echo 'starting build code'
RUN echo `ls /code/`

WORKDIR /code
# RUN ${MVN_HOME}/bin/mvn clean package -Dmaven.test.skip=true
RUN echo 'end'
  • build镜像
# 注意,镜像名不能包含大写
docker build -f Dockerfile -t cheers0606/go_manager:v1.0 .
  • 检查是否构建成功
[root@bogon buildGoManager]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
cheers0606/go_manager   v1.0                c382ed166a3b        22 minutes ago      637MB
centos                  latest              0f3e07c0138f        9 days ago          220MB
mysql                   latest              b8fd9553f1f0        4 weeks ago         445MB
centos                  centos7.6.1810      f1cb7c7d58b7        7 months ago        202MB
elasticsearch           6.6.2               1bca39c5a102        7 months ago        842MB
  • 打包镜像
docker save cheers0606/go_manager:v1.0 > go_manager.tar   

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GnU2cVd-1570859034622)(leanote://file/getImage?fileId=5da028809dd79a4695000000)]

  • 加载镜像
    打包完后的镜像可以发送给别人,然后直接加载镜像即可
docker load -i go_manager.tar

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDa2CFlS-1570859034622)(leanote://file/getImage?fileId=5da122aa5644053514000002)]

  • 运行镜像
# 运行并进入bash
# -v 为挂载本地路径,冒号前为物理机路径,冒号后为docker环境中的路径,最后的rw为权限,此处为读写
# -it : 目前的理解浅薄,就是要等在容器内的命令执行完毕才会出来到当前操作; 没有-it的加 就相当于在容器内执行一下命令,不等容器内部是否执行完毕直接出来,而我们看见的他在上面是因为容器内的执行快,(行动派可以试试在里面写个循环制造时间验证)
# --name docker名字
docker run -it -v /path/to/code:/code:rw --name=go_manager cheers0606/go_manager:v1.0 /bin/bash

# 运行但不进入bash
docker run -v /path/to/code:/code:rw  cheers0606/go_manager:v1.0 
# 进入正在运行的docker的bash。CONTAINER_ID可以通过docker ps 查看
docker exec -it  CONTAINER_ID  bash

  • 打包正在运行的容器
#-a :提交的镜像作者;
#-c :使用Dockerfile指令来创建镜像;
#-m :提交时的说明文字;
#-p :在commit时,将容器暂停。
[root@bogon buildGoManager]# docker commit -a "cheers0606" -m "mvn docker" bfba3e1cd30c cheers/gomanager:1.0
sha256:b5d08f5dc7b7f019e6d01917d9a47e5c500043236487f8c54e5d428ba604a55f
[root@bogon buildGoManager]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
cheers/gomanager        1.0                 b5d08f5dc7b7        9 seconds ago       739MB
[root@bogon buildGoManager]# docker run -it --name cheers cheers/gomanager:1.0 /bin/bash
# 打包后会包含运行过程中产生的数据。如mvn下载的依赖
[root@ed0e68b82d6b code]# du -sh /usr/share/maven/repository
106M	/usr/share/maven/repository
  • 将打包好的镜像pull到私服
[root@master /]# docker load -i gomanager_wiht_dependencies.tar
9e607bb861a7: Loading layer [==================================================>] 227.4 MB/227.4 MB
da5c1636e6ff: Loading layer [==================================================>]   408 MB/408 MB
c08404f8c986: Loading layer [==================================================>] 10.77 MB/10.77 MB
4cb4dc4134a3: Loading layer [==================================================>]  2.56 kB/2.56 kB
eb5be439dd35: Loading layer [==================================================>]  2.56 kB/2.56 kB
de7789f89c75: Loading layer [==================================================>] 8.192 kB/8.192 kB
469518fbefb5: Loading layer [==================================================>] 2.048 kB/2.048 kB
8aa83b1359d0: Loading layer [==================================================>] 104.9 MB/104.9 MB
Loaded image: cheers/gomanager:1.0
[root@master /]# docker images|grep gomanager
cheers/gomanager                                                                    1.0                                        b5d08f5dc7b7        15 hours ago        739 MB
[root@master /]# docker tag cheers/gomanager:1.0 master:5000/cheers/gomanager:1.0
[root@master /]# docker push master:5000/cheers/gomanager:1.0
The push refers to a repository [master:5000/cheers/gomanager]
8aa83b1359d0: Pushed
469518fbefb5: Pushed
de7789f89c75: Pushed
eb5be439dd35: Pushed
4cb4dc4134a3: Pushed
c08404f8c986: Pushed
da5c1636e6ff: Pushed
9e607bb861a7: Pushed
1.0: digest: sha256:fa84bb455b7ca647343cf8065d14690baf91cc3d563c7669f3974e2f0a1b03c8 size: 1994
  • docker prune 命令
    prune 命令用来删除不再使用的 docker 对象。
# 删除所有未被 tag 标记和未被容器使用的镜像:
docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
# 删除所有未被容器使用的镜像:
docker image prune -a
# 删除所有停止运行的容器:
docker container prune
# 删除所有未被挂载的卷:
# docker volume prune
# 删除所有网络:
 docker network prune
# 删除 docker 所有资源:
docker system prune

gomanager.tar镜像 编译gomanager

# 前提条件:可以连接公司的maven私服(192.168.0.65)
docker load -i gomanager.tar
docker run --name gomanager -it -v /path/to/code:/code:rw gosuncn/gomanager:v1.0 /bin/bash
${MVN_HOME}/bin/mvn clean package -Dmaven.test.skip=true
# 编译完成后,在/path/to/code/target中会生成相应的war包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RbJ8Oj9-1570859034623)(leanote://file/getImage?fileId=5da046055644053514000000)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcG8tlmu-1570859034623)(leanote://file/getImage?fileId=5da046255644053514000001)]

<think>嗯,用户想了解Docker学习路径。首先我得理清楚Docker的基础知识,然后分步骤来规划。可能用户是刚开始接触容器技术,需要从最基础的概念讲起。 首先应该介绍Docker是什么,为什么需要它。然后安装和环境配置,这部分可能需要涵盖不同操作系统的安装步骤,比如Windows、macOS和Linux。接着是基本命令,像镜像和容器的管理,这部分比较实用,用户可能需要实际操作例子。 接下来是Dockerfile和镜像构建,这是关键部分,用户需要学会如何自定义镜像。之后是数据管理和网络配置,这些在实际项目中很重要,比如卷的使用和容器间通信。然后是Docker Compose,处理多容器应用,用户可能会用到这个来部署复杂应用。 高级部分可能需要包括Docker Swarm和Kubernetes的基础,但用户可能暂时不需要太深入,可以简要提一下。最后是安全性和最佳实践,确保用户了解如何安全地使用Docker。 还要考虑用户可能的应用场景,比如开发、测试或者生产环境部署。可能需要推荐一些实践项目,比如搭建Web应用,帮助用户巩固知识。另外,学习资源方面,官方文档和社区资源很重要,可以推荐一些书籍或者在线课程。 需要检查是否有遗漏的部分,比如是否提到监控和日志管理,或者与其他工具集成,比如CI/CD。不过作为学习路径,可能先集中在核心内容,高级话题可以后续扩展。 最后,确保结构清晰,步骤由浅入深,让用户能够循序渐进地学习。避免使用过于专业的术语,保持解释的易懂性。同时,注意使用正确的Markdown格式,特别是数学公式部分,不过在这个问题中可能用不上,但需要遵守系统指令中的格式要求。</think>以下是分阶段Docker学习路径(建议配合实践操作): 一、基础入门阶段(1-2周) 1. 核心概念理解 - 容器与虚拟机的本质区别(资源隔离 vs 硬件虚拟化) - 镜像分层存储原理(联合文件系统) - 容器生命周期管理(创建→运行→停止→销毁) 2. 环境搭建 ```bash # Linux安装示例 curl -fsSL https://get.docker.com | bash -s docker sudo systemctl enable --now docker ``` 3. 基础指令实践 ```bash docker run -d -p 80:80 --name web nginx:alpine # 启动Nginx容器 docker exec -it web sh # 进入容器shell docker logs --tail 50 web # 查看日志 ``` 二、进阶应用阶段(2-4周) 1. Dockerfile编写技巧 ```dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"] ``` 2. 数据持久化方案 ```bash docker volume create db-data docker run -d -v db-data:/var/lib/mysql mysql:8.0 ``` 3. 网络配置实践 ```bash docker network create app-net docker run -d --net=app-net --name db redis:6 docker run -d --net=app-net -p 8080:80 webapp ``` 三、生产级部署阶段(1-2个月) 1. Docker Compose编排 ```yaml version: '3.8' services: web: build: . ports: - "5000:5000" depends_on: - redis redis: image: "redis:alpine" ``` 2. 镜像优化策略 - 多阶段构建(减少最终镜像体积) - 安全扫描(使用docker scan) - 镜像签名验证 3. 容器监控方案 ```bash docker stats # 实时资源监控 docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer ``` 四、持续学习建议 1. 官方文档精读(https://docs.docker.com) 2. 实验平台练习(推荐Play with Docker) 3. 参与社区项目(Docker GitHub仓库issue区) 4. 云原生技术延伸(Kubernetes、Service Mesh) 重点实践项目建议: 1. 构建完整LNMP环境 2. 实现CI/CD流水线 3. 搭建微服务架构演示系统 4. 容器安全加固实验 避坑指南: - 避免使用latest标签 - 容器内不要存储重要数据 - 生产环境限制容器资源配额 - 定期更新基础镜像版本 学习资源推荐: - 《Docker——容器与容器云(第2版)》 - 极客时间《深入剖析Kubernetes》(前4章) - Docker官方认证课程(DCA) - Katacoda交互式学习平台 建议每天保持1小时实践时间,通过实际项目巩固知识体系。遇到问题时,善用docker inspect命令分析容器状态,多查阅Docker官方文档的CLI参考手册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值