时效性,IT 技术本身发展就很快,对于这类技术更快,有些结论可能失效,请斟酌 更新:2019-12-01 发布:2018-08-27

前言

谈谈个人理解

如果你使用过 Linux,那么使用 Docker 很简单只需记住常用的 Docker 命令就可以!

相关资源

  • 网易镜像库地址,每个镜像的使用方式,都会有相应介绍,很方便
  • 慕课网的一个入门视频
  • 国内还有一个加速器可以配置下,很快,你也可以添加多个源

image.png

image.png

介绍

什么是 Docker?

可以存放应用的容器,集装箱,如果你用过vm,例如:virtual vm,那么 Docker 就是个轻轻轻量级的虚拟机

Docker 优势

简化运维,提供了统一的环境,节省了机器成本

跨平台,支持,win,linux,macos

Docker 架构

理解 Docker 的架构,有助于我们更好的使用,出现问题能看快速定位。常见的名词有以下:

  • docker images

docker 镜像,镜像其实就是文件,是只读的。镜像是由 Dockerfile 创建出来的。用于创建 Docker 容器的模板,比如我们要在 Docker 安装 Tomcat,就要去相应的仓库 pull 下 Tomcat 的镜像文件

  • docker container

Docker 容器,容器是独立运行的一个或一组应用,容器的本质是一个进程,容器是由镜像创建出来的,容器可读可写。可以理解为一个很小的虚拟机

  • docker registry

Docker 仓库,仓库用来保存镜像,可以理解为代码控制中的代码仓库,方便其他容器可以访问

  • docker host

Docker 主机,主机是用来执行 Docker 守护进程和容器

  • daemon

守护进程

安装

win7 下安装 Docker

请查看菜鸟教程

由于 Windows 的原因只能按照 toolbox,但是安装后点击 Docker Quickstart Terminal 会启动会失败,是因为安装目录下有个 boot2docker.iso 文件默认不是最新的,可以去 GitHub 上重新下载。安装目录下有个 start.sh 的启动脚本,但是本地要保证安装过 Git,就可以启动成功了,第一次会比较慢。(这是18年的安装经验,仅供参考)

Mac 下安装 Docker

Mac 安装非常简单,直接下载就行

验证

Docker 提供了一个 hello-world 镜像用来验证是否成功,执行命令:

  1. # 拉取一个 hello-world 的镜像
  2. docker pull hello-world

image.png

查看这个镜像信息,执行命令:

  1. # 查看本地所有镜像
  2. docker images

image.png

接下来,运行这个 hello-world 镜像,执行命令:

  1. # 也就是 REPOSITORY 这列的名称,或者是 IMAGE ID
  2. docker run hello-world
  3. 或者指定镜像ID
  4. docker run fce289e99eb9

会在控制台看到如下界面:

image.png

练习

1. 手动创建 Docker 镜像

第一步:touch Dockerfile //创建文件

第二步:vi Dockerfile //编辑,输入以下内容

  1. FROM alpine:latest
  2. MAINTAINER xbf
  3. # 运行命令,输出内容
  4. CMD echo 'hello docker'

第三步:docker build -t hello_docker . (这里是有个点的 //编译这个文件,-t 修改镜像文件名称为hello_docker,“.” 点表示当前路径下

第三步:docker images hello_docker //查看该镜像信息

第四步:docker run hello_docker //运行这个镜像文件,会输出 hello docker

2. 手动创建 Docker 镜像 Java Web 应用 jpress

第一步:先去网易镜像库下载 Tomcat 镜像,再去下载Jpress war包

第二步:创建文件 Dockerfile

第三步:编辑文件

  1. # 声明这个是基于Tomcat的和版本;格式:from <image>:<tag>
  2. from hub.c.163.com/library/tomcat:latest
  3. # 声明作者之类的,可省略
  4. MAINTAINER liueleven liueleven@aliyun.com
  5. # 复制war到Tomcat的目录,
  6. COPY jpress-web-newest.war /usr/local/tomcat/webapps

第四步:docker build -t jpress:latest . (注意:这里有个点)编译并改名称和版本

第五步:docker images 查看镜像

第六步:docker run -d -p 8888:8080 jpress

第七步:访问浏览器 http://118.126.102.69:8888/war包的名称/install

第八步:同理,安装mysql也类似安装 Tomcat 的步骤

3. 构建 JDK Dockerfile

第一步:vi Dockerfile,输入以下内容

  1. # 依赖镜像名称和ID
  2. FROM centos:7
  3. # 指定镜像创建者信息
  4. MAINTAINER liueleven
  5. # 切换工作目录
  6. WORKDIR /usr
  7. RUN mkdir /usr/local/java
  8. # ADD 是相对路径jar,把java添加到容器中
  9. ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
  10. # 配置java环境变量
  11. ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
  12. ENV JRE_HOME $JAVA_HOME/jre
  13. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
  14. ENV PATH $JAVA_HOME/bin:$PATH

第二步:docker build -t jdk1.8:v1 . 进行构建,当前路径下要有 jdk-8u171-linux-x64.tar.gz

第三步:docker images 查看镜像
image.png

第四步:docker run -d -i —name=jdk 1c0f22835462 运行该镜像,说明构建成功(如果有问题可以用 docker logs 容器id 查看日志)
image.png

第五步:docker stop 614a995121b9 停止该容器

4. Maven 中将 jar 构建成镜像

参考文章

Docker 相关命令

创建 Dockerfile 相关命令

  • FROM image:tag

根据那个镜像创建的,例如:FROM hub.c.163.com/library/tomcat:latest

  • MAINTAINER username

声明创建者,例如:MAINTAINER liuziqing 1473919563@qq.com

  • ADD fromFile toFile

添加宿主机文件到容器中,如果是压缩包自动解压

  • COPY fromFile toFile

添加宿主机文件到容器中,但是压缩包自动解压

  • WORKDIR pathDir

设置宿主机的工作路径

  • EXPOSE port1 port2 …

指定端口,容器中的应用和外部进行交互

  • CMD 参数

构建容器时,会被 docker run 后的参数覆盖

  • ENTRYPOINT 参数

构建容器时,不会被 docker run 后的参数覆盖

  • VOLUME

将本地文件挂载到容器中

  • ENV k1 v1 k2 v2 …

设置环境变量

使用命令

  • Volume

docker卷,独立 docker 容器之外的持久化存储

  • docker version

查看 docker 版本信息

  • service docker start

启动 docker

  • docker run 镜像名称

常见案例:

  1. docker run nginx
  2. # 用来运行容器,如果没有该模块 docker 会去下载
  3. docker run -d -p 8080:80 nginx
  4. # -p是端口映射,将容器nginx的80端口映射到主机的8080中,可以映射多个端口
  5. # -d表示在后台运行该应用
  6. docker run -it --name myjava java bash
  7. # 启动并运行一个容器
  8. # -it 开启交互界面,进入这个容器内部,exit来退出容器
  9. # --name 重命名为myjava
  10. # 镜像名称是java
  11. # bash 以bash命令模式运行
  12. docker run -it --name myjava -v /home/project:/soft --privileged java bash
  13. # -v 开启文件映射,将容器的文件映射到主机上,比如mysql的数据文件
  14. # /home/project主机上的文件路径,/soft容器上的路径
  15. # :/soft容器上的文件路径
  16. # --privileged最高权限,读写执行都可以
  17. docker run -it -d --name java1 -v java1:/home/soft --net=host java
  18. # 运行java容器,映射文件到主机上,并且把网段跟主机同步
  19. docker run --name mongo -p 27017:27017 -v /own/data/mongo:/data/db -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin -d mongo
  20. # --name 命名为mongo
  21. # -p 27017:27017 本地端口和docker做映射
  22. # -v /own/data/mongo:/data/db 本地存储路径和docker做映射
  23. # -e MONGO_INITDB_ROOT_USERNAME=admin -e传入环境变量
  24. # -d mongo 以守护进程在后台运行
  25. # 启动redis
  26. docker run --name redis -d -p 6379:6379 redis
  27. # 启动ubuntu
  28. # -d 守护进程
  29. # -p 端口映射
  30. docker run -d -it -p 9999:9999 --name btcubuntu ubuntu
  31. # 将一个容器打包成镜像
  32. # -a 作者
  33. # -m 备注
  34. # 容器id
  35. # 镜像名称和版本
  36. docker commit -a "eleven" -m "test zk cluster bak" f3abd2285a16 myzk2:v1
  • docker images

显示本地所有的镜像文件

  • docker stop 容器id

停止docker中的某个应用

  • docker ps

查看所有运行的容器信息

  • docker ps -a

查看所有运行和没运行的容器信息

  • docker restart 容器 id

重启某个镜像

  • docker rm 容器id

删除容器

  • docker rmi

删除 image 镜像

  • docker cp

用于 host 和 container 之间拷贝文件
从宿主机拷贝到容器:docker cp 宿主机文件 容器id:容器路径
从容器拷贝到宿主机:docker cp 容器id:容器文件 宿主机路径

  • docker commit

保存改动一个 mage,成为一个新的 image

  • docker pull 应用镜像名称

从仓库中心获取一个应用

  • docker pause 容器名

暂停某个容器

  • docker unpause 容器名

恢复某个容器

  • docker stop 容器名

停止某个容器

  • docker -i start 容器名

启动容器

  • docker search 应用

在仓库中搜索某个应用

  • docker save 镜像名称 > /路径/名称.tar.gz

从 docker 中导出镜像,另存到主机上

  • docker tag 镜像名称 新的名称

有的镜像名称很很长,就可以用这个命令复制一个新的镜像,然后删除旧的那个

  • docker network create —subnet=172.18.0.0/24 net1

docker 中创建网段,该网段名称是net1

  • docker network rm net1

删除 net1 这个网段

  • docker volume create v1

创建 docker 卷名称是 v1,卷只能是文件目录与文件目录之间的映射

  • docker volume rm v1

删除卷

  • docker inspect 名称

查看某个名称的详细信息

  • docker exec -it 容器名称 bash

进入某个容器内部

  • docker logs 容器id

查看某个运行中的容器日志