Mac版本Docker下载安装地址:https://download.docker.com/mac/edge/Docker.dmg
Docker 架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像。
最基础的从网上的镜像仓库pull镜像,或者把本地镜像push到网上的镜像仓库
如果是私有镜像仓库,需要在Docker Engine里加一行: "insecure-registries": ["私人仓库"],
私有仓库的需要先login:login 仓库地址 -u 用户名 -p 密码
docker pull 域名/路径:tag (拉取镜像到本地)
docker image ls 查看本地镜像目录
把本地的镜像推到私人仓库:
{
docker tag 本地镜像名:tag 目标域名/路径:tag (打包镜像成新镜像)
docker push 新镜像:tag (推送到目标镜像仓库)
}
docker image rm 镜像名或镜像ID (删除镜像)
把镜像打包成压缩文件:
docker save 镜像名:tag > 文件名.tar (docker打包成压缩文件)
把tar包解压为镜像:
将一个tar包load成一个image:docker load < my.tar 或者 docker load -i my.tar
从docker官网拉取nginx,run,build实战
docker pull nginx(默认从dockerHub官网的仓库里去拉取)
docker images 查看本地已有镜像
看到nginx已经拉取到本地了
接下来run
docker run -p 30080:80 -d nginx:latest (tag不输入的话就是默认latest)
-p设置端口,-d后台持续运行
出现一长串就是容器id,启动成功了,可以通过exec进入该容器
进入成功,可以通过cat /etc/nginx/conf.d/default.conf查看镜像的配置
也可以通过localhost访问
根据nginx来制作一个自己的Dockerfile
mkdir mynginx
cd mynginx
vi Dockerfile
里面写入
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html (相对于RUN指令,COPY和ADD等指令更为简单轻巧)
“FROM 指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx
镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM
就是指定 基础镜像,因此一个 Dockerfile
中 FROM
是必备的指令,并且必须是第一条指令。
在 Docker Hub 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 nginx
、redis
、mongo
、mysql
、httpd
、php
、tomcat
等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node
、openjdk
、python
、ruby
、golang
等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 ubuntu
、debian
、centos
、fedora
、alpine
等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch
。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
FROM scratch
...
如果你以 scratch
为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如 swarm
、etcd
。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch
会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。
回到构建镜像:
在Dockerfile同一路径下输入 docker build -t cnnginx:1.1 . (最后一个.是一个路径)
构建成功
run一下
docker ps 查看正在运行的容器
docker stop 容器名 (停止容器)
docker stop $(docker ps -aq) 停止所有容器
docker rm $(docker ps -aq) 删除所有容器
docker image rm 镜像名或id(删除镜像)
docker images -q 只显示镜像的id列表
docker ps -a 查看所有运行的容器
docker rm -f <ContainerID> 强制删除容器
容器停止重启后,对于原来那个容器的操作都会复原,在原来容器里的安装设置都会恢复。
docker system df 查看docker占用的磁盘空间
docker run 详解
docker run -it --rm nginx bash
-it
:这是两个参数,一个是 -i
:交互式操作,一个是 -t
终端。我们这里打算进入 bash
执行一些命令并查看返回结果,需要终端。
--rm
:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm
。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm
可以避免浪费空间。
nginx
:这是指用 nginx:latest 镜像为基础来启动容器。
bash
:放在镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash.
-d: 后台运行容器.
容器run起来之后,可以进入容器进行一些修改
docker exec ... bash 进入容器
apt-get update (先更新一下apt) apt-get install vim 下载vim命令(其他同理)
vim usr/share/nginx/html/index.html (修改html文件来生成自己的网brb/)
修改完成之后
docker commit --help 查看commit怎么用
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
docker commit -m " " 容器id 镜像名:tag(这样就保存修改生成新镜像了)
对于docker命令的一些简单理解:
ADD和COPY如果不需要加地址的话是一样的作用,要加地址就用ADD
常用的基础镜像(深入去玩):
Alpine: Alpine文档
Busybox:Busybox文档
Debian/Ubuntu:Debian/Ubuntu文档
CentOS/Fedora:CentOS/Fedora文档
Nginx:Nginx文档
MySQL:MySQL文档
Redis:Redis文档