0%

Docker

Docker

  • Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口

相关文档

Docker 中文文档

虚拟机 与 Docker

Docker 优势

  • 启动快
  • 资源占用少

Image/镜像

  • 应用程序和配置打包形成一个镜像
  • 一个镜像可以生成多个同时运行的容器实例

Container/容器

  • 用镜像创建的实例
  • mini 版的 Linux 环境

仓库

  • 存放许多镜像文件的场所

Docker logo 含义

dockerlogo 是一只鲸鱼稳定的航行在大海中,鲸鱼背上面有很多集装箱。

dock 本意码头

docker 代表码头上的工人

大海暗指宿主机

docker 就是这条鲸鱼

鲸鱼背上的集装箱就是一个一个的容器

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 #docker info
docker version
docker help

docker images //查看本地所有镜像
docker images -a //all 所以镜像,包括中间镜像
//docker image ls -a
-q // 只显示 id
docker search //查找镜像
docker pull //下载镜像
docker image rm // docker rmi -f 删除镜像
docker rmi -f ${docker images -qa} //删除全部镜像

docker run [options ] image_name/iamge_id // --name='容器名字'
// -i 以交互模式运行
// -t 为容器分配一个伪输入终端
// -p 端口映射
// host_port:container_port
// ip:host_port:container_port //
// ip::container_port
// container_port
// -d 后台运行 但会立即退出 //Docker容器后台运行,就必须有一个前台进程
//退出容器
exit //停止容器退出
ctrl+P+Q //不停止容器退出
docker ps //docker container ps //查看正在运行 容器
//-a 历史上运行过的
docker ps -l //上次运行过的
// -n 3 上3次运行过的
docker start //docker container start/stop/restart
docker kill //强制关闭容器
docker rm //docker container rm

//删除全部容器
docker rm -rf $(docker ps -aq) //docker ps -aq | xargs docker rm

//日志
docker logs -ft --tial id

//查看容器内运行的进行
docker top id

//查看容器的信息//配置等
docker inspect id

//进行正在运行的容器//在宿主机外面对容器执行命令
docker exec -it id command //docker exec -it id /usr/bin/bash 此时exit不会停止容器

docker attach id //进入容器

//从容器copy文件到宿主机
docker cp id:/path/file /path/file

//容器-->镜像
docker commit -m="msg" -a="author" id 镜像:[target]
//docker commit -m="这是基于hello world 容器更改后的新镜像" -a="daixiongsheng" fea2sdae54245 My_hello_world:latest

详解 Docker 镜像

docker 镜像是由一层一层文件系统组成 UnionFS ,包括 bootfs boot file system 和 rootfs root file system

bootfs 主要包含系统的 bootloader 和内核 ,rootfs 主要包含 mini Linux 系统中的标准目录和文件

  • 不同的镜像文件大小不一样

pull 一个 Hello world 镜像可能只有几 M,一个 CentOS 也就 200+M,但一个 Tomcat 需要 4、500+M

这是因为 hello world 只需要标准的输出控制,而 CentOS、Ubuntu 等都是基于 Linux 的,所以他们相应的镜像中某些功能就可以借助宿主机(比如内核等),而 Tomcat 不仅需要 Linux 内核,还需要 Java 运行环境(jdk..)所以相对前两者比较大,我们在 pull 一个镜像的时候可以看到下载的不只一个镜像,但最后暴露给用户使用的只能我们需要的那一两个。这种分层镜像就可以共享资源

容器数据卷

  • 将运行产生的数据持久化
  • 数据共享(宿主机到容器..)
1
2
3
4
docker run -it -v /宿主机目录:/容器目录 镜像名
# --privileged=true
# 容器停止后,主机仍可修改,待容器重新启动,数据会自己同步
# docker run -it -v /宿主机目录:/容器目录:ro 镜像名 #readonly
  • 数据卷容器
1
2
3
4
5
//容器B继承容器A的卷

docker run --name=A centos
docker run --name=B --volumes-from A centos

Dockerfile

  • Makefile 类似
  • Docker 镜像的构建文件
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交
  • 指令结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM			#基于哪个镜像   scratch是最基的镜像,类似js里面的Object类
MAINTAINTER #镜像维护的作者的email
RUN #构建时需要执行的命令
EXPOSE #暴露端口
WORKDIR #终端登陆进来的工作目录
ENV #设置环境变量 ENV MY_PATH /data
ADD #copy并解压缩到指定目录,也可处理url
COPY #复制
VOLUME #容器卷 VALUME["/dir1","/dir2"] 容器内的卷,主机上docker 会产相应的默认目录
CMD #容器启动运行的命令,有多个命令时,只有最后一个会生效,CMD会在docker run 之后的参数替换
# docker
ENTRYPOINT #容器启动运行的命令,和CMD一样,会追加,多个ENTRYPOINT都会执行,
#如果Dockrfile 最后一行是 ENTRYPOINT docker run 的参数会叠加给最后的ENTRYPOINT进行组合
#
ONBUILD #子镜像继承后运行时会触发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

FROM openjdk:8-jdk

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

...
...
...

RUN set -e \
&& nativeLines="$(catalina.sh configtest 2>&1)" \
&& nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \
&& nativeLines="$(echo "$nativeLines" | sort -u)" \
&& if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \
echo >&2 "$nativeLines"; \
exit 1; \
fi

EXPOSE 8080
CMD ["catalina.sh", "run"]
  • 构建成镜像
1
docker build -f dockerfile -t author/app .

发布镜像

  1. 镜像来源* Dockerfile-->build
    • container-->commit
  2. aliyun 创建仓库
1
2
3
docker login --username=username [仓库地址]
docker tag [ImageId] [公网/专有地址]:[镜像版本号]
docker push [公网/专有地址]:[镜像版本号]

Docker 关系