理解 Docker
Docker 帮助你为应用程序创建一个单独的可部署单元。这个单元,也被称为容器,包含该应用程序需要的所有东西。它包括代码(或者二进制文件)、runtime(运行环境)、系统工具盒系统库。将所有必需的资源打包成一个单元将确保无论应用程序部署到哪里都有完全相同的环境。这也有助于维护一个完全相同的开发和生产配置,这在以前是很难追踪的。
一旦开始,容器的创建和部署将自动完成。它消除了一大类问题。这些问题主要是由于文件没有同步或者开发和生产环境之间的差异导致的。Docker 帮助解决了这些问题。
相比于虚拟机的优势
容器提供了与虚拟机相似的资源分配和隔离优势。然而,相同之处仅此而已。
一个虚拟机需要它自己的客户操作系统而容器共享主机操作系统的内核。这意味着容器更加轻量而且需要更少的资源。从本质上讲,一个虚拟机是操作系统中的一个操作系统。而另一方面的容器则更像是操作系统中的其它应用程序。基本上,容器需要的资源(内存、磁盘空间等等)比虚拟机少很多,并且具有比虚拟机快很多的启动时间。
Docker 在开发阶段的优势
在开发中使用 Docker 的优势包括:
- 一个用于所有团队成员的标准开发环境
- 更新的依赖性集中化以及在任何地方都能使用相同的容器
- 在开发和生产中完全相同的环境
- 修复了可能只会出现在生产环境中的潜在问题
开始准备:
- 安装好
go
环境和docker
环境的centos7.0
服务器一台 - 在
/root
目录(或者其他目录)下有 go 工作目录(我的以/root/go/src/
为例) - 在本机上安装好
bee
工具(便于调试) - 在
src
目录下面bee new test_docker
配置 Docker 用于开发:
- 创建 Dockerfile
在root目录下mkdir docker_test 在此目录下创建Dockerfile
vi Dockerfile (一般将Dockerfile放入所对应需要部署的文件夹中以便于将对应的文件加入到docker中)
FROM golang:1.9.1
# Install beego and the bee dev tool*
RUN go get github.com/astaxie/beego && go get github.com/beego/bee
# Expose the application on port 8080
EXPOSE 8080
# Set the entry point of the container to the bee command that runs the
# application and watches for changes
CMD ["bee", "run"]
FROM golang:1.9.1
Go 的官方映像文件作为基础映像。该映像文件预安装了 Go 1.9.1
该映像已经把 $GOPATH
的值设置到了 /go
。所有安装在 /go/src
中的包将能够被 go 命令访问。
RUN go get github.com/astaxie/beego && go get github.com/beego/bee
安装 beego
包和 bee
工具。beego
包将在应用程序中使用。bee
工具用语在开发中再现地重新加载我们的代码。
EXPOSE 8080
在开发主机上利用容器为应用程序开放 8080 端口
CMD ["bee", "run"]
使用 bee
命令启动应用程序的在线重新加载
- 构建 image
进入创建好的 docker_test 文件夹,运行如下的命令来创建 image(注意后面的 .
)
docker build -t test-image .
-t 是指tag的意思 构建了一个叫做test-image的镜像
为了查看你的系统上的 image 列表,运行如下的命令:
docker images
这行该命令将输出与以下类似的内容:
REPOSITORY TAG IMAGE ID CREATED SIZE
test-image latest 8d53aa0dd0cb 31 seconds ago 784.7 MB
golang 1.9.1 22a6ecf1f7cc 5 days ago 743.9 MB
注意 image 的确切名字和编号可能不同,但是,你应该至少看到列表中有 golang
和 test-image
image
如果发现在尝试过程中 build
了多余的无效的镜像,可以尝试使用
docker rmi [IMAGE ID](上图中的IMAGE ID)
使用rmi移除对应的ID的镜像
- 运行容器
一旦 test-image
已经完成,你可以使用以下的命令启动一个容器:
docker run -it --name test-instance -p 8080:8080 -v /root/go/src/docker_test:/go/src/docker_test -w /go/src/docker_test test-image
让我们分析一下上面的命令来看看它做了什么。
docker run
命令用于从一个 image 上启动一个容器-it
标签以交互的方式启动容器--rm
标签在容器关闭后将会将其清除--name test-instance
将容器命名为test-instance
-p 8080:8080
标签允许通过8080
端口访问该容器-v /root/go/src/docker_test:/go/src/docker_test
更复杂一些。它将主机的/root/go/src/docker_test
映射到容器中的/go/src/docker_test
。这将使得开发文件在容器的内部和外部都可以访问。
test-image
部分声明了用于容器的image
。
运行完后你会发现,你的 beego 项目运行起来了此时是处于调试 ctrl+c
就直接停了,重新再执行上述的命令的时候会发现说容器已经存在
解决方法:
docker ps -a 查看容器运行状态
1、docker rm [容器id] 直接删除容器 然后再执行上述命令运行
2、
1>命令中加 -d参数 后台运行 [我没有试成功]
2>或者跑起来后ctrl+p+q
3>或者在命令最后 空格+& 挂起
等等
最后我们访问 ip+端口
应该是可以访问到我们运行起来的 web 应用
此时我们就用 docker
部署了一个开发模式下的 web 应用
由于在Semaphore一直没有注册成功用户名一直被占用 QAQ,后面的自动化部署就没做了。
于是乎我马上将自己以前写的一个 web 应用用 docker 开始部署。
首先我将 Dockerfile 放在了 beego 项目与 main.go 平级下 由于项目中用了 vendor 于是 Dockerfile 修改如下
FROM golang:1.9.1
# Install beego and the bee dev tool*
RUN go get github.com/astaxie/beego && go get github.com/beego/bee
RUN go get -u github.com/kardianos/govendor
ADD vendor /TlfShaw
RUN govendor get -v github.com/jinzhu/inflection
RUN govendor get -v github.com/go-sql-driver/mysql
RUN govendor get -v github.com/iqysf/gorm
RUN govendor get -v gopkg.in/chanxuehong/wechat.v2
# Expose the application on port 8080*
EXPOSE 8087
# Set the entry point of the container to the bee command that runs the*
# application and watches for changes*
CMD ["bee", "run"]
ADD vendor /TlfShaw 这是将主机中vendor文件夹添加到beego项目中
关于数据库 docker 中连接主机数据库直接用 ip 远程连接的方式了
docker 还有许多学习的地方
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于