Docker学习笔记(一)Docker初体验
什么是Docker
Docker是一个虚拟环境容器,可以将开发环境、代码、配置文件等一并打包到这个容器中,并发布应用到任意平台中
Docker的安装
在Doker的官方网站 点击Download from Docker Store,在docker store中点击GetDocker即可下载mac的dmg文件
下载完成后,正常安装运行
错误
打开Docer发现如下错误
Docker does not rely on VirtualBox but may not work properly on systems with VirtualBox v4.3.28 is currently installed.
Please upgrade or uninstall VirtualBox
大致的意思就是说 虽然Docker不依赖于VirtualBox,但是在VirtualBox版本太低的电脑上无法运行,可以选择写在VirtualBox或者更新VirtualBox,尝试卸载ViertualBox后问题依旧,最后在VirtualBox官网更新了最新版本的VirtualBox之后 问题解决,打开Docker,Docker正常运行
安装完成后,可以使用
docker version
来查看版本信息安装完成后,再注册一个Docker的账号
第一个docker镜像
基本命令
docker pull [options] name[:tag]
- 该命令会从docker的远程仓库拉取docker的镜像
- name : 表示镜像的名称
- tag : 表示镜像的版本,如果不填写,默认是最新版本的docker
docker images [options][repository[:tag]]
- 该命令会查看本机都有哪些镜像,可以用来验证pull是否成功
- repository : 指定镜像名称
- tag : 版本
docker仓库(Repository)
官方仓库,该仓库是官方仓库,但是访问速度比较慢
网易蜂巢镜像中心,需要登录后访问该网址
docker也支持自己搭建镜像仓库
HelloWord
下载
输入命令,该命令会从官方仓库去下载镜像
docker pull hello-world
运行
命令:
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
- IMAGE : 镜像的名字
- options :
-d
在后台运行
doker ps
可查看当前机器上所启动的镜像
docker exec # 进入容器内部
exit #退出
执行
docker run hello-world
docker 网络
下载nginx
- 下载Nginx镜像 : hub.c.163.com/library/nginx
- 在后台运行镜像
- 使用
docker run -d hub.c.163.com/library/nginx
来在后台启动nginx镜像,会返回容器的ID
- 进入容器内部
docker exec -it 容器id bash
-i : 可以保证输入有效
-t : 容器会分配给我们一个终端
容器id 可以只写前几个字母
docker网络
Docker网络类型
docker中有3中网络类型
- Bridge : docker中每一个容器默认都是独立的网络,默认选项
- Host : 和主机使用同一个网络
- None : 没有网络
端口映射
在容器中的端口和主机中的端口建立一个映射
使用命令
docker run -d -p 8080:80 hub.c.163.com/library/nginx
来启动容器,-p的参数表示主机的8080端口映射到容器的80端口,访问主机的8080端口即可放完到nginx了
Docker中关于镜像的基本操作
利用镜像启动一个容器后进行修改 ==> 利用commit提交更新后的副本
下载centos镜像并启动,进入容器
docker pull hub.c.163.com/library/centos:latest
docker run -it hub.c.163.com/library/centos
root@307bb1848b9e:/# git --version
bash: git: command not found
发现没有安装git,使用yum命令安装git,安装完成后再检查git命令:
执行commit操作将容器转换为一个镜像
docker commit -m "centos with git" -a "cfy" 307bb1848b9e cfy/centos:git
其中, -m指定说明信息;-a 指定用户信息307bb1848b9e为容器的id;使用docker ps -a
命令查询得到;cfy/centos:git指定目标镜像的用户名,仓库名和tag信息
操作完成后使用docker images查看:
此时我们在进入该docker,检查git
~ docker run -it cfy/centos:git bash
[root@f952d74b63af /]# git --version
git version 1.8.3.1
制作自己的镜像
- Dockerfile : 告诉docker如何制作镜像,每一个步骤是什么
- docker build : 根据Dockerfile来制作镜像
- JPress : 一个开源的Java博客平台(jpress.io)
创建DockerFile
说明
Dockerfile可以理解为一种配置文件,用来告诉docker build命令应该执行哪些操作,一个建议的Dockerfile文件如下所示
# 说明该镜像以哪个镜像为基础
FROM centos:latest
# 构建者的基本信息
MAINTAINER cfy
# 在build这个镜像时执行的操作
RUN yum update
RUN yum install -y git
# 拷贝本地文件到镜像中
COPY ./* /usr/share/gitdir/
创建Tomcat的镜像
首先下载tomcat的镜像
docker pull hub.c.163.com/library/tomcat:latest
编写镜像的Dockerfile
form hub.c.163.com/library/tomcat
MAINTAINER liuguoguo 734481463@qq.com
# 将本地的war包拷贝到tomcat的目录中
COPY jpress.war /usr/local/tomcat/webapps
使用build命令来构建镜像
docker build -t jpress:latest .
-t表示来为镜像起一个名字和标签,最后的点表示在当前目录寻找Dockerfile文件,这里要注意该命令会默认将Dockerfill所在目录下的所有文件发送到Daemon,这就会导致内容非常多,尽量使用空目录来存放dockerfile和所需要的资源文件
运行自己的TomCat
启动容器
docker run -d -p 8888:8080 jpress
在浏览器输入 http://localhost:8888/jpress/ 出现如下信息:
证明我们的tomcat运行成功了,可以看到jpress需要一个mysql数据库,来下载一个mysql的容器
docker pull hub.c.163.com/library/mysql:latest
在页面中可以找到mysql的使用命令,-e为docker的命令,表示要输入一个环境变量,参数为键值对,可以指定数据库的密码,接着运行mysql
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=A_000000 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql:latest
将mysql映射到3307端口,并设定MYSQL的密码为A_000000,数据库名为jpress,这样mysql就能成功运行了,检查一下3307端口是否正常监听:
netstat -na|grep 3307
可以看到3307端口已经开启监听了
配置JPress
数据库名和用户名密码填写mysql的设置用户名及密码,而数据库的主机不能填写localhost,因为tomcat在容器内部如果填写localhost则代表是容器自己,需要填写我们电脑的ip地址,端口号则填写我们做映射的端口号,点击下一步
设置网站的用户名和密码,下一步
jPress告诉我们需要重启web服务器
docker restart 4b0e395d1cbc # 输入id重启容器,该命令不会改变容器的id
再看一下网站
发现我们的网站已经起来了
容器连接
在测试之前可以使用docker stop 容器ID
指令来将之前的容器停止,而容器停止之后,之前设置的东西就全部会小时
使用主机ip进行转发的这种连接tomcat和mysql方式显然不好,如果我们的主机ip地址发生了变化,那么配置就会失效,而docker允许容器之间课件并安全的创建连接,首先我们创建数据库容器
docker run -d --name db -p 3307:3306 -e MYSQL_ROOT_PASSWORD=A_000000 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql:latest
与之前不同的是,我们使用--name指令,为数据库容器起了一个名字叫db
可以看到数据库容器已经有了一个名字叫db,然后运行tomcat容器
docker run -d -p 8888:8080 --name jpress --link db:db jpress
同样的将tomcat容器映射到8888端口,然后为容器起一个名字叫jpress,并通过--link指令来连接容器,link指令:
--link name:alias
name是我们连接容器的名字,alias是连接的别名,
回到我们jpress的设置页面,其他项都不变,注意数据库主机这里填写我们连接的别名,即可连接到数据库
总结
Docker思想
想要把程序部署到另外一台计算机中,把所有的相关程序利用docker打包,这里面包含了程序所有的开发环境,可以做到开发环境与生产环境的同一,并标准化的运输,其实Docker与虚拟机差不多,但是Docker要比虚拟机小快很多,例如启动一个虚拟机可能需要几分钟,但是启动一个docker只需要几秒
Docker的三个基本概念
1. 镜像(Image)
类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像
2. 容器(Container)
类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。而容器可以理解为一个操作系统的进程
3. 仓库(Repository)
类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。