介绍为什么和如何使用docker
Why and How To Use Docker for Development
使用理由
1、对于整个团队来说,一致的开发环境。(无论是windows,还是mac等等)
2、开发环境与生产环境保持一致。
3、如果有一些很难编译的东西,请在docker里面编译。后续可以直接使用。
4、只需要使用docker去开发,不需要搭建各种开发环境在本机。
5、如果需要一种语言的多种版本,利用docker在不同版本中编译和运行
6、开发更加容易,如果代码运行自己容器,同时也可以运行在服务上。(在相同docker镜像或把自己镜像重新打包)
7、继续使用自己喜欢IDE工具,不要运行虚拟机,不需要通过shell进行开发。
如何使用
主要关注以下两点:
1、确保所有依赖和代码都在你的工作目录里
2、改变我们开发方式,去docker容器里面运行命令
剩下内容是作者以ruby来介绍如何使用
我们不需要在本地安装ruby环境
将以下代码放入 hello.rb
puts 'Hello Ruby!'
运行以下命令
docker run --rm -v "$(pwd)":/app -w /app ruby ruby hello.rb
这样可以直接打印出 "Hello Ruby!"
以下通过加入一些依赖(开发需要,但是不需要本地安装)在容易中运行。
以下代码放入Gemfile文件
source 'https://rubygems.org'
gem 'hello-world'
将hello.rb修改这样
require 'hello-world'
puts 'Hello Ruby!'
如果本地安装gems,可以直接运行。但是这个docker(指定镜像)不可以直接运行。我们可以针对这个镜像进行安装,但我们需要进行管理和记得镜像状态,在去下一个服务器上部署也要进行相同操作。
(这种情况主要是自己没有打包镜像,使用之前镜像会存在这样问题)
我们不重新打包镜像,我们也可以把所有代码和依赖打成一个小包,然后类似以下方式运行
docker run --rm -v "$(pwd)":/app -w /app ruby bundle install --standalone --deployment
这样就会把所有依赖安装到工作环境,所有需要编译都正确完成。
继续修改 hello.rb,增加最上面一行
require_relative 'vendor/bundle/bundler/setup'
require 'hello-world'
puts 'Hello Ruby!'
继续运行
docker run --rm -v "$(pwd)":/app -w /app ruby ruby hello.rb
然后运行没问题,但是我们先运行在不同版本上面,如下
docker run --rm -v "$(pwd)":/app -w /app ruby:2.4 ruby hello.rb
一些例如web app需要端口,我们可以使用-p实现docker内部和本机端口进行映射,如下
require_relative 'vendor/bundle/bundler/setup'
require 'sinatra'
set :port, 8080
set :bind, '0.0.0.0' # required to bind to all interfaces
get '/' do
"Hello World!"
end
以下代码-p进行端口映射
docker run -i -t --rm -v "$(pwd)":/app -w /app -p 8080:8080 ruby ruby webapp.rb
下面有一些java和go展示就不赘述
本人用docker还是比较少,之前只是按照一个oracle和tomcat的docker,知道一些基本命令。 run都是安装,安装之后就直接start命令运行环境。也可以用docker exec -it XXX bash进入docker环境。也用docker logs -f XXX来查看日志。上诉有些用法还没有用到,需要继续学习。
作者目前介绍命令都是运行完之后就会立刻删除的。主要使用--rm条件。如下就不会删除
docker run — name goapp -v $GOPATH:/gopath -v “$(pwd)”:/app -w /app golang sh -c ‘go build -o hello && ./hello’ || docker start -ia goapp
后续安装完毕之后,可以接用docker xxx start/stop直接启动和停止