什么是docker

Docker 的基本组成

  1. 镜像( image )

    docker 镜像好比是一个模板,可以通过这个模板来创建容器服务。

  2. 容器( container )

    docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建。

    启动,停止,删除等基本命令

1. 仓库( repository )

​ 仓库是存放镜像的地方,( 共有和私有仓库 )

安装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
# ubuntu 下
# 1.卸载旧的版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 2.设置仓库
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 3.切换成国内的镜像源
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
# 4.更新软件包缓存
sudo apt update
# 5.安装docker 服务
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 6.启动docker
sudo service docker start
# docker 测试
# 查看docker 版本信息
docker verison
# 运行一个docker实例
sudo docker run hello-world

docker底层

docker 是一个 client-server 结构的系统,docker的守护进程运行在主机( 宿主 )上。通过Socket从客户端访问。docker-server 接收到 docker-client 之后就会去运行。

docker为什么比VM快

  1. docker比VM有更少的抽象层。
  1. docker利用的是宿主机的内核

docker 容器数据卷

什么是容器数据卷?

如果数据都在容器中,我们将容器删了就会导致数据丢失 ==需求:数据持久化==

容器之间数据共享 docker容器中的数据同步到本地

==将容器数据目录挂载到宿主机上!==

使用数据卷

1
docker run -it -v 宿主目录:容器目录 

Dockerfile

dockerFile 是用来构建一个docker image的文件

1
2
3
4
5
# 自定义DockerFile
FROM centos
VOLUME [“volume01”,“volume02”]
CMD echo "-----end-----"
CMD /bin/bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 构建Docker miage
docker bulid -f 构建miage使用的文件 -t images名字 images保存目录

#
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ['volume01','volume02']
---> Running in d8eb0d2ef56e
Removing intermediate container d8eb0d2ef56e
---> 5fc6e1709489
Step 3/4 : CMD echo "-----end-----"
---> Running in f2b5b231b3b0
Removing intermediate container f2b5b231b3b0
---> 48f502e08ca4
Step 4/4 : CMD /bin/bash
---> Running in e916a60079d8
Removing intermediate container e916a60079d8
---> 1a522655fe62
Successfully built 1a522655fe62
Successfully tagged long/centos:latest

DockerFile构建

基础知识

1. 每个关键字都必须是大写
1. 执行顺序是从上到下
1. #表示注释
1. 每个指令都会构建一层新的镜像,并提交!

DockerFile指令

1
2
3
4
5
6
7
8
9
10
11
12
FROM 		# 基础镜像,一切从这里开始构建
MAINTAINER # 作者, 名字+邮箱
RUN # 运行的命令
ADD # 添加新的内容,会自动解压压缩包
WORKDIR # 镜像工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口
CMD # 指定这个容器运行的命令,只有最后一个会生效
ENTRPOINT # 追加命令
ONBUILD # 当构建一个被继承 DockerFile 就会触发这个指令
COPY # 类型ADD,将我们的文件拷贝到镜像中,不会自动解压压缩包
ENV # 构建时设置环境变量

编写一个自己的centos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 编写一个 dockerFile
FROM centos
MAINTAINER long<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

# 构建 docker Image
docker build -f dockerFile名字 -t 镜像名 ./

容器卷自动挂载技术

--volumes-from

1
2
3
4
5
6
7
8
# 将一个容器的数据卷和另外一个容器的数据卷挂载到一起
# 先启动一个 自定义的centos 里面加入了数据卷
docker run -it --name centos01 long/centos /bin/bash

# 启动第二个 自定义centos时 使用容器卷自动挂载
docker run -it --name centos02 --volumes-from centos01 long/centos /bin/bash

# 此时 第一个容器会产生对应的 volume 卷,第二个容器会使用第一个容器已经产生了的 volume 卷,就不会产生新的 volume 卷

Docker网络

docker0 就是docker在虚拟机中的地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 先运行一个 容器 
# ip addr 我们就可以得到容器内部的地址
docker run -it --name centos01 centos ip addr

# eth0@if57 eth0@if 开头的就是 docker给容器分配的地址

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
56: eth0@if57: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

# 容器和容器之间是可以相互ping通的

自定义网络

1
2
3
4
5
6
7
8
9
# 创建了一个名为 mynet的网络组
# --driver 网络模式
# --subnet 子网地址
# --gateway 网关地址
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet


# 新建容器时可以指定加入到自定义网络中
docker run -d -P --name tomcat-net-01 --net mynet tomcat