Docker在我刚出来实习的时候就有接触到,那会只是将公司里制作好的包去客户那边进行简单部署,只知道Docker是个容器可以在里面安装运行软件,其他一概不知。今天学习的时候刚好遇到Docker的内容,特此记录一下。
为什么有Docker
不使用Docker时,开发人员交付的是jar(或者war包)包,交付完成之后,由运维人员进行部署,运维人员还需要部署应用jar所依赖的环境(mysql、mq等)。这对于跨环境非常不友好,可能出现在我机器上是好的,在你机器上却又问题,在Linux上是可以的,在windows上却不行。
使用Docker之后,开发人员交付的是Docker的镜像,而Docker镜像中除了有应用程序之外还有应用程序依赖的环境。这样其他人拿到镜像之后,就可以在任何地方(需要支持Docker)一键将应用运行起来。
Docker是什么
Docker 是一个开源的应用容器引擎。它支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;
为了更加形象的说明,我们将Docker和Windows镜像做个类比。我们一般自己安装系统使用的多是镜像文件(.gho或.iso),安装完毕我们会发现系统中已经帮我们装好了一些常用的软件及一些配置。这是在制作镜像文件的时候,制作者将这些常用的软件制作进去了,而我们对镜像文件进行还原(安装操作系统)时,这些软件就会包含在内。Docker中的镜像和windows镜像系统的常用软件类似。

Docker中可以包含多个镜像,镜像一旦运行起来就变成了容器,一个镜像可以运行多次对应多个容器。这里可以看到,镜像类似于编程语言中类的概念,而容器类似于对象。
核心概念
- Docker客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 和Docker主机进行交互。
- Docker主机(Host):安装了Docker程序的机器。
- Docker仓库(Registry):用来保存镜像,类似于代码仓库。
- Docker镜像(Images):是用于创建 Docker 容器的模板,放在Docker仓库当中。
- Docker容器(Container):独立运行的一个或一组应用。
Docker架构图
Docker仓库分为公共的和私人的,公共的Docker仓库可以访问https://hub.docker.com进行查看,类似于Maven的公共仓库。
Docker安装
推荐使用Centos,可以直接使用yum,安装起来很方便。
1、检查内核版本,必须是3.10及以上
uname -r
2、安装docker
yum install docker
3、输入y确认安装
4、启动docker
[root@localhost ~]# service start docker
[root@localhost ~]# docker -v
Docker version 1.13.1, build 94f4240/1.13.1
5、开机启动docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service
to /usr/lib/systemd/system/docker.service.
6、停止docker
service stop docker
启动Docker服务
[root@localhost ~]# service docker start --或者systemctl docker start
关闭Docker服务
[root@localhost ~]# service docker stop --或者systemctl docker stop
使用Docker的步骤:
1)、安装Docker
2)、去Docker仓库找到这个软件对应的镜像;
3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;
4)、对容器的启动停止就是对软件的启动停止;
HelloWorld
安装完成之后,我们来运行一下Docker提供的hello world
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
docker 镜像运行流程图

Docker常见操作
1)、帮助命令
| 命令 | 说明 | |
|---|---|---|
| docker version | 显示docker的版本信息 | |
| docker info | 显示docker的系统信息,包括镜像和容器的数量 | |
| docker 命令 --help | 帮助命令 |
2)、镜像操作
| 操作 | 命令 | 说明 |
|---|---|---|
| 检索 | docker search 关键字 eg:docker search redis | 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。 |
| 拉取 | docker pull 镜像名:tag | :tag是可选的,tag表示标签,多为软件的版本,默认是latest |
| 列表 | docker images | 查看所有本地镜像 |
| 删除 | docker rmi image-id | 删除指定的本地镜像 |
| 构建 | docker build | 构建镜像,通常情况下都是通过Dockerfile文件来构建镜像 |
2)、容器操作
1、搜索镜像
[root@localhost ~]# docker search tomcat
2、拉取镜像
[root@localhost ~]# docker pull tomcat
3、根据镜像启动容器
docker run --name mytomcat -d tomcat:latest
4、docker ps
查看运行中的容器
5、 停止运行中的容器
docker stop 容器的id
6、查看所有的容器
docker ps -a
7、启动容器
docker start 容器id
8、删除一个容器
docker rm 容器id
9、启动一个做了端口映射的tomcat
[root@localhost ~]# docker run -d -p 8888:8080 tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口
10、查看容器的日志
docker logs container-name/container-id
更多命令参看
https://docs.docker.com/engine/reference/commandline/docker/
可以参考每一个镜像的文档
注意,在Docker中启动一个应用时,一定要做端口映射。不然客户端是无法访问到主机中的Docker容器。
Docker中安装软件
Docker中安装MySQL
- 查找MySQL,然后拉取镜像
docker search mysql
docker pull mysql
可以直接跳过步骤1,从步骤2开始执行。当运行步骤2时发现本地没有回去远程下载对应的镜像。
- 创建容器
docker run -d -p 3310:3306 -v /Users/zhangguicong/volumes/mysql/conf:/etc/mysql/conf.d -v /Users/zhangguicong/volumes/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
–name:给新创建的容器命名,此处命名为mysql01
-e:配置信息,此处配置mysql的root用户的登陆密码
-p:端口映射,此处映射主机3307端口到Docker容器mysql1的3306端口
-d:后台运行
-v: 卷挂载
3.如果想要外面可以访问Docker中的MySQL,需要先进行授权。
3.1 先进入容器的命令模式
docker exec -it mysql1 /usr/bin/bash
3.2 然后登录MySQL进行授权操作
mysql -uroot -p
grant all privileges on *.* to root@"%" identified by "123456" with grant option;
Docker 安装 MySQL
Docker 安装 Tomcat
Docker 安装 Redis
Dockerfile
Dockerfile是一个普通的文本文件,里面包含了许多可以在命令行接口上执行的用来构建镜像的相关指令,我们通过docker build指令就可以读取Dockerfile文件中的指令并执行自动化镜像构建。
一般情况下,Dockerfile文件可分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时的执行指令。
Dockerfile常用指令

