Mac下Docker的使用
自从接触了Docker,我就深深的觉得:Docker的使用应该是一个开发人员,尤其是基于Linux的Web服务端开发人员应该具备的基本技能之一!其实Docker的使用也并不复杂,熟悉两个命令
docker
、docker-machine
和一个Dockerfile
就可以在你的本机开发环境中跑起来了。
Docker最具价值的功能在于它可以实现将应用部署完全的程序化,由此,我们创建一个主机、部署一个应用不再需要重复的人工操作,基于它背后庞大的镜像社区Docker Hub,一行命令就可以搞定一台虚拟机,一个Dockerfile就可以部署一个应用……这样不但提高了部署效率也大大降低人工操作的出错风险。更重要的是,这也让更多自动化的需求成为可能,比如:在系统负载过高时自动部署应用镜像来均衡负载,提高系统稳定性!
安装
我是一个忠实的Mac用户,在Mac下安装使用Docker也不止一种途径,比如官方提供的:Docker for Mac和Docker Toolbox。
如果你的系统版本够高,我其实更推荐使用Docker for Mac,因为Docker Toolbox需要另外安装VirtualBox。
我是个MacPorts的重度用户,在电脑的使用上还有严重的洁癖!所以我的Docker环境是用MacPorts维护的(当然你也可以选择homebrew)。其实这差不多就是在用Docker Toolbox了,也就是说,你还是要有VirtuaBox或者VMWare Fusion。不多说了,还是放码吧,安装:
$ sudo port install docker docker-machine docker-compose
docker-machine
要运行docker,首先得有可用的Docker Machine,本地环境中的Machine可以由
docker-machine
命令来维护。
先来ls一下:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
没有machine,所以还是要自己动手先来创建,其实就是一个VirtualBox或者VMWare Fusion驱动的VM,命令如下:
$ docker-machine create --driver virtualbox default
再ls:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default - virtualbox Stopped Unknown
OK有了,来启动这个machine:
$ docker-machine start default
Starting "default"...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.85.135:2376"
export DOCKER_CERT_PATH="/Users/yourname/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"
# Run this command to configure your shell:
# eval $(docker-machine env)
$ eval "$(docker-machine env default)"
好了,我们的Docker Machine算是启动了,如果要ssh连接到这个主机,需要用docker-machine ssh default
。
在Docker主机中如果要切换su,执行
sudo -i
就可以了。
常用的docker-machine命令:
docker-machine create
创建docker-machine start
启动docker-machine stop
停止docker-machine env
查看环境参数docker-machine ip
查看IPdocker-machine ssh
ssh连接docker-machine ls
machines 列表
docker
下面该docker
登场了!docker info
可以查看当前接入的Docker Machine的信息,我们先来run一个mysql试试:
$ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysqlpwd -d mysql
这个命令会创建一个运行mysql的容器,容器的3306端口(也就是mysql的服务端口)会被映射到docker主机的3306端口,mysql的root用户密码是MYSQL_ROOT_PASSWORD
指定的mysqlpwd
。我们可以用下面的命令连接这个mysql服务看看:
$ mysql 192.168.85.135 -u root -p
可以了吧,好了,关于run命令的更多信息可以docker run --help
查阅。如果要停止上面那个容器可以用docker stop mysql
。run过之后,这个容器(Container)和镜像(Image)都已经保存在本地了,下次再运行这个容器可以直接运行docker start mysql
而不需要再docker run
了。
常用的docker命令:
docker build
通过Dockerfile构建镜像docker run
运行容器docker ps
显示当前运行的容器(加-a
参数可以列出本地所有容器,包括未运行的容器)docker start
启动容器docker stop
停止容器docker rm
删除容器docker rmi
删除镜像
Dockerfile & docker build
Dockerfile文件用于声明自动构建镜像的一系列命令,
docker build
使用这个文件来构建镜像。在我之前的文章“用SAE Docker一个Ghost博客”中,我就是用Dockerfile来构建的Ghost应用。
当你编写好了Dockerfile之后,你就可以使用docker build
命令了:
$ cd /path/to/workdir/
$ docker build .
我们也可以在build的时候为镜像命名,另外,在build的时候,docker还会为每一个步骤(命令)生成缓存,我们可以加--no-cache
参数取消缓存,如下:
$ docker build -t image_name --no-cache .
build成功后,执行docker images
就可以看到本地的镜像列表,如果是第一次执行可以用docker run
,如果已经作为容器运行了(docker ps -a
查看)则可以用docker start
来启动容器。另外docker run
时也可以指定环境变量,例如:我在“用SAE Docker一个Ghost博客”中的Dockerfile,因为用到了SAE的环境变量,所以,在本地测试环境中,我就把本地环境配置放到一个名为env-dev.list的文件中,内容类似这样:
MYSQL_HOST=192.168.85.135
MYSQL_PORT=3306
ACCESSKEY=ghost
SECRETKEY=ghost
APPNAME=ghost
GHOST_URL=http://192.168.85.135:7000/
PORT=2467
然后docker run
:
$ docker run --name ghost -p 7000:2467 --env-file=./env-dev.list -v /var/storage/ghost:/var/storage/ghost ghost_image
这条命令使用ghost_image镜像启动容器并将容器的2467端口映射到主机的7000端口,同时将主机的/var/storage/ghost
目录挂载到容器的/var/storage/ghost
。
没什么问题的话,我们就可以通过在浏览器输入http://192.168.85.135:7000/
来访问这个Ghost应用了。
参考: