文章目录
docker 是什么
Docker 是一个基于Go语言开源的应用容器引擎。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器相当于一个个彼此隔离的沙箱,开销极低。
相比于vm,docker没有操作系统(也有说法是只提供最基本的操作),容器内的应用直接在宿主机上运行。耗费的系统资源更少,启动更快。
镜像是怎么来的
docker中有两个重要的概念,镜像和容器。其中,镜像是一个封装了依赖和资源的特殊的文件系统,容器则是镜像的一个实例,是一个运行于自己的命名空间中的独立进程。数据存储在容器中,使用容器的生命周期。
镜像是可以一层一层叠加的,子镜像会继承父层镜像的配置,在此基础上添加修改形成自己的特性。
从ducker hub上拉一个
docker-hub上存在众多已经配好的镜像,使用方法类似git,docker pull 即可获取。
从Dockerfile生成
a目录在有DockerFile文件,那么在a目录下 docker build 即可获得一个根据该dockerfile生成的镜像。
以下就是一个express服务的dockerfile。
FROM node:10
WORKDIR /Users/xuemengge/playground
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 5556
CMD node server.js
用镜像run一个容器
有了镜像, docker run <imagename> <cmd>
即可根据镜像启动容器。imagename
可以通过docker images
获得。docker run
的参数比较多。参见下一节。
启动容器后,可以通过docker ps
来看所有运行态的容器,如果加了-a
参数,还可以看到已经停止的容器。
容器可以通过docker stop
,docker restart
来停止和重启
容器的网络模式
看了下我司在Jenkins上的配置,docker run的时候都会加上参数–net=host。这是什么意思呢?
这代表容器处于网络模式下,此时docker不会为容器创建单独的网络网络,而是共享主机的网络。也就是说,容器暴露出什么端口,主机就直接监听的是什么端口。这种配置比起配-p
映射要更直接。适用于知道主机上有哪些容器的项目。否则很容易起冲突。
常用命令
docker build
docker build [OPTIONS] PATH | URL | -
- -f :指定要使用的Dockerfile路径
- –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- –pull :尝试去更新镜像的新版本;
例如docker build -t runoob/ubuntu:v1 .
,代表使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。
docker run
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
-
-i: 以交互模式运行容器,通常与 -t 同时使用
-
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-
–t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用, -it
-
–name=“nginx”: 命名容器
-
–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
docker exec 在运行的容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
- it 跟docker run的-it一样,都是给一个交互式输入终端
docker exec -it 9df70f9a0714 bash
docker exec -it 9df70f9a0714 /bin/bash
通过exec命令进入容器中并执行bash
这篇文章写得原理不错,值得一看。