初识 Docker
Docker
是近几年比较火的技术,每个技术栈的程序员对应该对其有所了解,本文是自己作为一个栈外人学习 Docker 的一些笔记或总结。
About Dcoker
首先,通过官网的两句 Slogan
来感受一下:
- Docker is the world’s leading software containerization platform
- Build, Ship and Run any App, Anywhere
![](https://i-blog.csdnimg.cn/blog_migrate/cd51e2dfae8b8dd9d83d5436f3c5f6ab.png)
Dokcer 是一个容器化平台,要搞懂 Docker 的概念,必须先从 容器
入手。容器即将软件及其依赖环境打包成独立、标准的单元,以用于分发、部署和运行等。容器类似于虚拟机,但不是虚拟机,比虚拟机更轻量。容器是对操作系统的抽象,而虚拟机是对硬件的抽象。
![](https://i-blog.csdnimg.cn/blog_migrate/a635356494798f7bb82d6f91fbff4238.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2389b8e3d952afdd231baa733db6c136.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4066956550b7e68ea3590a6f72e4fc90.png)
Dokcer 具备 轻量化
、独立性
等特点。Docker 容器共享操作系统内核,能够迅速启动,占用很少的计算和内存资源。Dokcer 镜像是一个独立的可执行软件包,它包含运行所需的一切代码、运行时、系统工具、系统库和设置等,可以避免同一基础架构上运行不同软件的环境冲突等。
架构及概念
![](https://i-blog.csdnimg.cn/blog_migrate/2e77661e8f056437a4c60768b493a70a.png)
- Image: 镜像,特殊的文件系统,包括应用程序及其运行环境,分层存储的架构
- Container:容器,镜像运行时的实体,实质是进程
- Registry:镜像仓库,集中存放镜像的地方,SaaS服务
![](https://i-blog.csdnimg.cn/blog_migrate/fcf1245f9b62edfda9280cebc1ca57fa.png)
- Daemon:守护进程
- Client:客户端
- Host: 宿主机
国内外常用仓库:
常用命令
docker pull:从仓库拉取镜像
docker run:运行容器
docker commit:将容器中的修改提交为镜像
docker build:通过 Dockerfile 的定义来构建镜像
docker push:将镜像推送的仓库
docker images:查看本地的镜像
docker ps:查看当前正在运行的容器
docker image:列举镜像相关的所有命令
docker container:列举容器相关的所有命令
拉取镜像
docker pull
命令:
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
其中 TAG
的默认值为 latest
,下面演示从国内仓库拉取 alpine
最新镜像(如果不指定仓库地址,将从国外仓库下载)。
D:\>docker pull registry.docker-cn.com/library/alpine:latest
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete
Digest: sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Status: Downloaded newer image for registry.docker-cn.com/library/alpine:latest
通过 docker images
命令查看本地镜像:
D:\>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.docker-cn.com/library/alpine latest 3fd9065eaf02 5 months ago 4.15MB
启动容器
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
Options:
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
-d, --detach Run container in background and
D:\>docker run -it -d 3fd9065eaf02
d8df22290941805825fe13e389b4b995113c6cfd9154dd9b499c05b3be7db698
D:\>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8df22290941 3fd9065eaf02 "/bin/sh" 4 seconds ago Up 3 seconds sleepy_leakey
D:\>docker exec d8df22290941 echo Hello Docker
Hello Docker
生成镜像
构建 Docker 镜像有以下两种方式:
- 使用
docker commit
命令 - 使用
docker build
命令和Dockerfile
文件
Dockerfile 语法
FROM : base image
RUN : 执行命令
ADD : 添加文件(包括远程服务器,HTTP/FTP)
COPY : 添加文件或目录
CMD : 执行入口(ENTRYPOINT)
EXPOSE : 暴露端口
WORKDIR : 指定路径(运行命令)
MAINTAINER : 维护者
ENV : 设定环境变量
USER : 指定用户,通常不用root
VOLUME : mount point(容器所挂在的卷)
Dockerfile 实例
From alpine:latest
MAINTAINER Iron
CMD echo hello docker
docker build -t hello_docker . // .表示所有内容送给 docker enginer 编译成docker
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /va/www/html
ENTRYPOINT ["/user/sbin/nginx", "-g", "daemon off;"] // 将nginx在前台执行
EXPOSE 80
镜像分层存储
- 每一行对应一层,分层共享
- 容器运行起来会加载一个container(可写),其它层只读
FROM ubuntu:14.04
ADD run.sh /
VOLUME /data
CMD [“./run.sh”]
D:\Docker\New folder>docker build .
Sending build context to Docker daemon 3.584kB
Step 1/4 : FROM ubuntu:14.04
---> 578c3e61a98c
Step 2/4 : ADD run.sh /
---> d520c5c81f2e
Step 3/4 : VOLUME /data
---> Running in 27c7a6153279
Removing intermediate container 27c7a6153279
---> b5327c7403b5
Step 4/4 : CMD [“./run.sh”]
---> Running in cf02ecda0bf5
Removing intermediate container cf02ecda0bf5
---> 51cedcaa4906
Successfully built 51cedcaa4906
![](https://i-blog.csdnimg.cn/blog_migrate/5edf1f329535c03f20511bfb00d6d02c.png)