docker
以下内容总结自《第一本Docker书》,作者:[澳]James Turnbull
mac 下载docker.app
docker-for-mac https://docs.docker.com/docker-for-mac/#where-to-go-next
有些书籍可能会推荐下载docker toolbox,较新版的mac系统可以下载docker-for-mac,两者底层的依赖不一样。docker toolbox还是依赖的Oracle VirtualBox,而docker-for-mac是基于HyperKit。
官网教程:https://docs.docker.com/docker-for-mac/install/
进去之后,一键下载。
照着教程安装一下,就可以执行下面命令尝试一下。
简单命令记录
$ docker --version
Docker version 18.03, build c97c6d6
$ docker-compose --version
docker-compose version 1.21.2, build 8dd22a9
$ docker-machine --version
docker-machine version 0.14.0, build 9ba6da9
# 查看已启动的docker镜像
$ docker container ls
$ docker ps
# 查看已启动的 或 已关闭的 所有镜像
$ docker ps -a
$ docker container ls -a
# 查看已安装的镜像
$ docker image ls
# 删除已安装的镜像
$ docker image rm nginx
# 从仓库拉取fedora镜像(在冒号后面指定标签,可拉取固定的景象,默认是拉最新的)
$ docker pull fedora:20
# 查找镜像
$ docker search fedora
# 删除容器
$ docker container rm container_name
$ docker rm container_name
# 查看容器内的进程(container_name是容器名字)
$ docker top container_name
# 查看容器统计信息(下图)
$ docker stats container_name
# 查看容器更多的信息
$ docker inspect container_name
# 查看容器的IP地址(--format或-f 支持go语言模板的语法)
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name
容器统计信息
解决docker中Linux乱码的问题
保存立即生效
# 进入乱码的操作员的home目录
cd ~
# 编辑 .vimrc 文件,如果没有则新建
vi .vimrc
#设置tab分隔符为4个空格
set tabstop=4
#解决中文乱码的设置
set termencoding=utf-8
set encoding=prc
镜像image
和容器container
的区别
网上有很多比喻,这里摘几个来:
- 一个镜像可以用于多个容器。一个镜像就像中间件,可以被多个容器同时使用。
- A container is a stripped-to-basics version of a Linux operating system. An image is software you load into a container。
容器就像是基础版的Linux操作系统,镜像就是你下载在操作系统中的软件。
镜像的实例化就是一个容器。
比如说你有以下镜像
jdk8的镜像:jdk8-image
jdk7的镜像:jdk7-image
git的镜像:git-image
svn的镜像:svn
maven3的镜像:mvn3-image
当你准备好了这些镜像,如果你要搭建一个jdk7+git+mvn3的环境,你只需要把你需要的镜像像搭积木一样搭建起来即可。
而且还有一个好处是,减少了环境带来的问题。咱们开发很容易碰到这样的场景:这代码在我那边明明运行的好好地。这也是在书中最早就提到的,docker诞生的原因之一。
docker container/image ps/ls 区别
-
查看运行中的容器
docker container ls
或docker ps
目前使用起来两者完全一样,docker container ls
是后期加入到,加入了container
显得更人性化一些,是在针对容器进行到操作。 -
查看所有容器
docker container ls -a
或docker ps -a
或docker container ps -a
这行命令会展示正在运行中的以及已经关闭(exit)的容器。 -
查看所有镜像
docker images
或docker image ls
展示所有镜像
启动一个webserver
# 利用启动一个web服务(第一次启动,会去docker hub下载这个镜像,可能需要等一下)
$ docker run -d -p 80:80 nginx
# 指定名字启动nginx(否则docker会自动生成一个名字给你)
$ docker run -d -p 80:80 --name webserver nginx
# 根据镜像名字关闭镜像(也可通过镜像id)
$ docker container stop webserver
# 删除容器(镜像关闭之后,容器还是存在的,这个命令可以删除容器)
$ docker container rm webserver
启动成功后,地址栏访问localhost:80即可,展示如下:
webserver删除所有容器
docker rm `docker ps -a -q`
删除所有容器
提交一个自己的容器(@deprecate)
目前docker团队,已经不建议使用commit创建镜像了,这里的记录只供学习,推荐使用Dockerfile
比如说需要给团队提供一个统一的镜像文件,这里假设说提供一个装有统一版本Apache2的Ubuntu系统镜像。
那我们就可以从docker仓库先拉一个下来,然后以交互的形式doker run -i -t ubuntu /bin/bash
启动镜像,然后apt-get -y install apache2
安装Apache2 。
到这一步,我们需要的镜像就已经完成了,剩下的commit和push,和git的版本控制是大同小异。
# 启动Ubuntu镜像
# -i 开启容易中的STDIN,保证持久的标准输入。-t 表示为创建的容器分配一个伪tty终端
# 这样新创建的容器才能提供一个交互式shell
$ docker run -i -t ubuntu /bin/bash
# 安装Apache2(安装完成后,退出即可)
$ apt-get -y install apache2
# 如果需要push到docker仓库的话,需要先登录
# 登录docker(在docker官网注册,需要翻墙)
$ docker login
# 查找制定的容器的ID
$ docker ps -l
# 提交制定的容器(同时会创建一个新的镜像,名字为anthony/ubuntu)
$ docker commit 89dde2ef6166 anthonyxu/ubuntu
# push到远程docker仓库
$ docker push anthonyxu/ubuntu
登录成功
查看制定的容器ID
将镜像推送到docker仓库
使用Dockerfile构建镜像
- 首先准备一个Dockerfile文件,该文件里面包含了一系列用于构建镜像的指令。
- 执行
docker build -t="仓库名/镜像名" .
构建镜像
# 创建一个目录,并新建一个Dockerfile文件
$ mkdir dockers
$ cd dockers
$ touch Dockerfile
# 编辑Dockerfile文件
$ vim Dockerfile
# 构建新的镜像,也可以用-f,指定构建源文件路径 -f xxx/xxx/xxx
docker build -t="anthonyxu/static_web" .
Dokerfile文件内容:
# Dockerfile笔记
# Dockerfile是由一系列指令和参数组成,每条指令,都必须全都大写。
# 每条指令,都会创建一个新的镜像层并对镜像进行提交
# 第一条指令必须是FROM
# 下面是版本注释
# Version: 0.0.1
# FROM指令:指定一个已经存在对镜像,后面指令都是基于该镜像进行对,这个镜像被称为基础镜像
FROM ubuntu:latest
# MAINTAINER 作者 邮箱
MAINTAINER anthonyXu "xxx@xxx.com"
# RUN指令,会在当前镜像中运行指定命令
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, i am in your container ' > /usr/share/nginx/html/index.html
# EXPOSE指令,告诉docker,该容器内对应用程序将会使用容器对指定端口。
# 出于安全考虑,docker不会自动打开该端口。
# 需要用户在run的时候,指定需要打开的端口,所以这里EXPOSE指令,可以指定多个端口。
EXPOSE 80
docker build日志:
admin@anthony:~/dockers$ docker build -t="anthonyxu/static_web" .
Sending build context to Docker daemon 2.56kB
Step 1/5 : FROM ubuntu:latest
---> 452a96d81c30
Step 2/5 : MAINTAINER anthonyXu "xxx@xxx.com"
---> Running in b1dfca10ec1d
Removing intermediate container b1dfca10ec1d
---> 2990b0f6086d
Step 3/5 : RUN apt-get update && apt-get install -y nginx
---> Running in b56d0fcd7876
此处省略。。。。。。。。
---> b251410f1071
Step 4/5 : RUN echo 'Hi, i am in your container ' > /usr/share/nginx/html/index.html
---> Running in 54ad9e8e6f06
Removing intermediate container 54ad9e8e6f06
---> b8bfae7c5388
Step 5/5 : EXPOSE 80
---> Running in 8c8981c63be7
Removing intermediate container 8c8981c63be7
---> b95a17d5f7be
Successfully built b95a17d5f7be
Successfully tagged anthonyxu/static_web:latest
如何跳过docker缓存:docker build的过程中,每一步的构建过程都会将结果提交为镜像。它会将之前的镜像层看作缓存。如果Dockerfile中的有1-5条指令,修改了第4条指令,需要再次构建时,docker会跳过1-3条指令,直接从第4条开始;但如果第1-3条指令有修改,当重新构建时,还是会从第1条开始执行。另外,如果不想使用docker的缓存,可以使用命令:docker build --no-cache -t="xxx/xx"
- 从新镜像启动该容器
启动镜像还是以docker run
命令,-d
选项告诉docker以分离(detached)的方式在后台运行,这比较适合运行类似nginx守护进程这样的需要长时间运行的进程。-p
选项控制docker在运行时应该公开哪些端口给外部宿主机(会在宿主机上随机打开一个端口(32768~61000之间))这个端口会映射到容器的80端口。
docker ps
可以查看端口映射,如下所见0.0.0.0:32768->80/tcp
,容器的80端口被映射到了宿主机的32768端口上。
admin@anthony:~/conf/zdal$ docker run -d -p 80 --name static_web anthonyxu/static_web nginx -g "daemon off;"
473b9f061142c510ed8974fe0cc0487bc9b969a996e4536c8a55b5acacdfe434
admin@anthony:~/conf/zdal$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
473b9f061142 anthonyxu/static_web "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp static_web
如何绑定到宿主机哪个端口:通过-p
选项,如docker run -d -p 8080:80 后面省略
,这条命令会将容器中到80端口绑定到宿主机到8080端口。重点!因为宿主机8080端口被占用,那在宿主机上运行到服务将无法绑定8080端口,另外的容器也无法绑定8080端口。
如何绑定到特定网络接口:命令docker run -d -p 127:0:0:1:8080:80 省略后面
如何绑定到随机端口:命令docker run -d -p 127:0:0:1::80 省略后面
- 访问nginx页面
浏览器中直接访问http://localhost:80
或者http://localhost:32768
将构建完成到镜像推送到Docker hub
当镜像构建完成后,可以将它上传到Docker hub,这样其他人就可以使用该镜像。
推送命令:docker push static_web anthonyxu/static_web
其中anthonyxu
是用户名,static_web
是仓库名,推送成功后,可以登录https://hub.docker.com/查看。
admin@anthony:~/dockers$ docker push anthonyxu/static_web
The push refers to repository [docker.io/anthonyxu/static_web]
d33a335f1738: Pushed
f945ea2bd62f: Pushed
059ad60bcacf: Mounted from anthonyxu/ubuntu
8db5f072feec: Mounted from anthonyxu/ubuntu
67885e448177: Mounted from anthonyxu/ubuntu
ec75999a0cb1: Mounted from anthonyxu/ubuntu
65bdd50ee76a: Mounted from anthonyxu/ubuntu
latest: digest: sha256:fab3b575457c17098f476fd9cbb44e753608ddeb9461c2820d2b5559c17fdb50 size: 1776
docker仓库上的镜像