学习docker,既然学习了,那么自然需要有输出。这篇就算学习笔记了。先看看一些基础知识。
一个工具,这个工具可以帮助你创建一个虚拟机。然后你可以对这个虚拟机环境进行各种配置。既然建立了虚拟机,就可以实现对虚拟机的管理,比如start,restart,stop等。还可以把这些虚拟机怎么建立的发布在网上,让大家都可以用。比如你想要一台java环境的ubuntu,以前你需要自己搞一个虚拟机,然后在里面安装java,然后配置网络映射。现在就只需要使用docker,然后用一个命令,就可以拿到已经安装了java的ubuntu,然后起一个虚拟机,同时映射网络。
先来看看docker engine,官网是这样介绍的:
At the core of the Docker platform is Docker Engine, a lightweight runtime and robust tooling that builds and runs your Docker containers. Docker Engine runs on Linux to create the operating environment for your distributed applications. The in-host daemon communicates with the Docker client to execute commands to build, ship and run containers
这个图告诉我们,docker engine会在os上面在创建一个环境。
先来看看docker在macOS上是怎么办的?
在docker mac上的安装文档里有说明,由于docker这个daemon,需要linux的kernel。所以docker没办法直接运行在MacOS上。所以需要先在Mac上创建一个虚拟机(Virtual Machine)咯。这个虚拟机还得是一个linux。这个虚拟机的创建就可以使用docker-machine。
在linux上,localhost就是docker host,也就是说Docker client, Docker daemon,以及containers都是直接运行在那台linux物理机上,而不是运行在虚拟机里。有个图:
同样的,在mac系统上也有一张图:
对比这两个图,就知道不同了。图里面还有一些概念:
那么,在MacOS上使用docker,需要做什么呢?
docker-machine create --driver virtualbox <machine_name>
啦。docker-machine env <machine_name>
eval "$(docker-machine env <machine_name>)"
。docker-machine env <machine_name>
的结果是:1 | export DOCKER_TLS_VERIFY="1" |
eval就是把这些export …全部都在当前的shell执行一遍。我猜通过设置这些property,docker client就知道怎么去访问docker host了。顺便说一句刚刚建立的虚拟机是有一个自己的ip地址的。使用docker-machine ip <machine_name>
可以得到该machine的ip,然后docker-machine ls可以列出所有的docker machine。
由于docker是可以直接运行在linux上的,所以linux上不需要创建虚拟机,所以在linux上,默认情况下,不需要使用docker-machine。所以玩docker还是找个linux distribution吧。
那么在linux上需要安装什么呢?1
apt-get install docker-engine
docker-engine就可以了。
总结一下,docker-engine是docker需要的执行环境以及一些工具,是基础。docker-machine是用来创建和管理docker vm或者说是docker环境的。Docker host指的就是运行docker的机器,linux上就是运行linux的物理机,windows和mac上是一个虚拟机。Docker daemon是docker host里面运行的一个docker相关的程序,这个程序会完成诸如contaienr管理之类的工作。Docker
client是在docker虚拟机外的一个客户端,可以独立运行在linux,mac,和windows上。用户通过docker client跟docker daemon通信,以此完成各种操作,比如image的创建,container的生成等。
docker官方还有一张图:
需求 | 命令 |
---|---|
查看系统信息 | docker info |
查看所有命令 | docker -h |
查看单个命令帮助文档 | docker help |
pull一个image | docker pull |
创建image | docker build |
列出image | docker images |
删除image | docker rmi |
删除所有image | docker rmi $(docker ps -aq) |
创建container | docker run |
列出正在运行的container | docker ps |
列出所有的container | docker ps -a |
删除container | docker rm |
删除所有container | docker rm $(docker images -q) |
start container | docker start |
restart container | docker restart |
stop container | docker stop |
signal kill container | docker kill |
在某个container执行命令 | docker exec -it |
查看webapp的log | docker logs -f |
查看映射的端口 | docker port |
查看container的进程 | docker top |
inspect network | docker network inspect [OPTIONS] NETWORK |
create network | docker network create –driver bridge |
list network | docker network ls |
———————— | ———————— |
使用container_id的地方也可以使用container_name。
创建一个image,就是创建一个模板,里面定义了这个image包含了哪些内容。这个模板叫做Dockerfile。有了Dockerfile之后,就可以通过命令docker build <directory that contains Dockerfile>
来生成image了。这个过程就是根据Dockerfile来执行各种操作。下面是一个Nginx的Dockerfile:1
2
3
4
5
6
7
8
9
10
11FROM debian:jessie
MAINTAINER koly li <kolyjjj@foxmail.com>
ADD ./nginx_signing.key /tmp/
RUN chmod 755 /tmp/nginx_signing.key
RUN apt-key add /tmp/nginx_signing.key
RUN echo "deb http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y curl vim nginx && apt-get clean && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /var/www/html
# backup the default.conf file
RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf_bac
ADD global.conf /etc/nginx/conf.d/
最前面的大写的是docker提供的命令,这里是docker file的文档。
set -i 's/daemonize no/daemonize yes/' /usr/local/redis/reids-3.0.6/redis.conf
参考资料:
[1] docker官方文档