文章目录
Docker
前记:
- 官网:https://www.docker.com/
- 文档:https://docs.docker.com/
- 仓库:https://hub.docker.com/
- 命令:https://docs.docker.com/reference/
- 文字教程:https://www.runoob.com/docker/docker-tutorial.html
- 视频教程(感谢狂神):https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=4222847082563063237
- 我的学习阶段一在这里就结束了!撒花🌷永远抱着菜鸟的学习心态!
一、概述
-
Docker出现的原因之一是部署环境的不便
-
基本流程:jar(带上环境) --> 镜像 --> Docker仓库 --> 拉取部署
-
核心思想:沙箱隔离(apple os也是类似)。Docker是容器技术(也可以说是虚拟技术)
-
基本名词:
- 镜像(imaga):像一个模板,可能通过这个模板来创建容器服务。一个镜像可以创建多个容器。
- 容器(container):容器技术可以独立运行一个或者一组应用,通过镜像来创建。可以想象成简易的操作系统环境。
- 仓库(repository):存放镜像的地方
-
Docker 比 VM 快原因:
- Docker比VM有更少的抽象层 ???
- docker利用的是宿主机的内核,而VM是完整构建出一个操作系统
- 省去了引导启动的时间
-
整个概况图:
二、安装
环境:CentOS 7
tips:可以在不同操作系统下安装,且有不同的安装方式。具体看官网。
https://docs.docker.com/engine/install/centos/
- 查看docker版本:
docker version
- 查看docker镜像:
docker images
基本安装
-
卸载旧版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装工具
sudo yum install -y yum-utils
-
设置仓库
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 阿里云镜像 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum索引(非必需)
yum makecache fast
-
安装引擎
ce代表communication edition ee代表enterprise edition sudo yum install docker-ce docker-ce-cli containerd.io
-
启动
systemctl start docker
-
运行hello-world镜像
docker run hello-world 输出如下: Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world b8dfde127a29: Pull complete Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
-
卸载
yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker rm -rf /var/lib/containerd
阿里云镜像加速
-
进入阿里云服务管理平台侧边栏–产品与服务–容器镜像服务–镜像加速器
-
Linux下单独运行每一条命令: 注意:不同操作系统不一样 不同的主机也不一样,根据自动生成的文件来。 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://8k7qckqg.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
三、基本
1、镜像启动流程
2、工作原理
- Docker是一个Client-Server结构的系统
- 守护进程运行在主机上,相当于Server
- 主机启用运行镜像命令,相当于发送客户端命令,所有创建相应容器
3、帮助命令
两种查看帮助方法:
- 直接上命令官方文档:https://docs.docker.com/reference/
docker --help
或者docker 命令 --help
- 两种方法是等价的
docker version
显示版本信息docker info
显示dokcer的系统信息,包括镜像和容器的数量
4、镜像命令
- 镜像下载地址可以在官方网搜索,然后拿到对应命令执行。等价于直接的命令行https://hub.docker.com/
------------------------------------------------------------------
镜像查看
docker images [Options]
Options:
-a, 显示全部镜像,包括隐藏的
-q, 只显示id
-aq 组合使用,显示所有镜像的id
------------------------------------------------------------------
镜像搜索
普通搜索:docker search 名字
过滤搜索:docker search mysql --filter=STARS=2000 #会把stars大于等于2000的显示出来
------------------------------------------------------------------
镜像下载
#镜像下载中,可以看到,是文件是分层的。如安装mysql5.7了,再安装mysql8.0,那么8.0版本并不会下载全部的文件内容,而是下载与mysql5.7版本不同的内容,相同的内容会共享
docker pull mysql #用搜索后的NAME来指定下载
docker pull mysql:5.7 #指定版本下载
在执行安装命令后,可以看到一个地址:docker.io/library/mysql:5.7
那么安装就等价于:(下面两者是等价的)
docker pull mysql:5.7
docker pull docker.io/library/mysql:5.7
------------------------------------------------------------------
镜像删除
docker rmi -f 镜像id1 镜像id2 镜像id3
docker rmi -f $(docker images -aq) #把images的所有id当成参数传入
5、容器命令
- 注意容器删除与停止的区别。
-
启动容器:
docker run [OPTIONS] IMAGE/IMAGEID [COMMAND] [ARG...]
-
会从镜像中创建一个新的容器实例。
-
–name==“名字” 给容器命名
-
-d 后台方式运行。注意:容器要使用后台运行,必须有一个前台进程,docker发现没有应用,就会自动停止。
-
-it 使用交互方式进行,并进入容器查看内容。后面应该带上参数:/bin/bash,指定交互界面
-
-p(小写)
- -p ip:主机端口 容器端口 将指定主机端口映射到容器端口
- -p 主机端口 容器端口 和上面一样,这个更常用
- -p 容器端口 不设置映射,只设置容器的端口
-
-P(大写) 随机指定端口
-
例子:docker run -it centos /bin/bash
-
-
查看:
docker ps [OPTIONS]
- -a 列出所有的容器,包括当前运行的和历史运行过的
- 不选项,则只列出当前运行的容器
- -n=数字 列出最近创建的n个容器
- -q 只显示容器id
-
退出
exit
退出并杀死容器(这个命令要进入容器内部使用)crlt + p + q
退出,但不杀死容器
-
删除
docker rm 容器id
删除指定的容器,但不能删除正在运行的容器。加上-f可以强制docker rm -f $(docker ps -ap)
强制删除所有的容器docker ps -aq|xargs docker rm
删除所有的容器。xargs是给命令传递参数的一个过滤器
-
启动与停止
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
强制停止
-
进入容器
docker exec -it 容器id /bin/bash
docker attach 容器id
- 两种方式区别:exec是打开了另外一个终端(新建了一个进程用top命令可明显看出),而attach是接着上一个终端
6、其它常用命令
- 查看日志
-f代表持续显示,-t显示时间,--tail+数字,显示多少条日志 0f39f3140dc0容器的id
[root@MeowSir /]# docker logs -ft --tail 10 0f39f3140dc0
[root@0f39f3140dc0 /]#
2021-03-19T04:05:15.154991466Z [root@0f39f3140dc0 /]# ls
2021-03-19T04:05:15.155016447Z bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
- 查看容器中的进程信息
[root@MeowSir /]# docker top 0f39f3140dc0
UID PID PPID C STIME TTY TIME CMD
root 15293 15273 0 12:05 pts/0 00:00:00 /bin/bash
- 查看容器元数据
[root@MeowSir /]# docker inspect 0f39f3140dc0
以下是部分信息:
{
"Id": "0f39f3140dc05dbd48dbc0665108ed7f6c5f6013cf79553c56ae09bb4680148f",
"Created": "2021-03-19T04:05:03.312428057Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-03-19T04:05:03.654019612Z",
"FinishedAt": "2021-03-19T04:13:02.972086467Z"
},
- 拷贝
- 是从容器内拷贝到主机。注意,即使容器停止运行,里面的数据还是可以拿到的。
docker cp 容器id:容器内路径 主机路径
7、Portainer可视化
https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/
-
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
-
外网可以访问:ip:9000
-
登录后可以看到如下管理界面:
8、分层
-
镜像是什么?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
-
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 -
镜像加载原理
docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。
主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs
对以一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就行,因为底层直接用host和kernel,自己只需要提供rootfs就行。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
-
联合文件系统优点:
- 共享资源
- 节约内存
-
docker的镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”
9、commit镜像
- docker的镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”
- 容器层可以被打包成一个新的镜像,成为一个独立的个性化的镜像。
- 注意和发布镜像、dockerfile打包镜像的区别
-m表示注释,-a表示作者,5e1eedb5118c是容器id,tomcathao是新镜像名
只是提交到本地。
[root@MeowSir ~] docker commit -m="cp webapps.dis/* to webapps" -a="hao" 5e1eedb5118c tomcathao
sha256:3cd5f5679430b44d0f1aa042205efe6c986955e1d03e1b4823996de90b4a87b1
用镜像命令可以看到已经创建的镜像了
[root@MeowSir ~] docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcathao latest 3cd5f5679430 9 seconds ago 654MB
四、高级知识
1、数据卷
具体挂载
-
数据卷技术:将容器内的目录挂载到主机上去
-
数据可以持久化
-
容器之间、主机与容器间可以实现数据共享
-
命令:在run时加上
-v 主机目录1:容器内目录1 -v 主机目录2:容器内目录2
即可实现挂载 -
挂载时,最好主机目录是空的或者是不存在的。
-
-v 主机目录:容器目录:rw / ro
代表对于容器来说,挂载的目录是只读还是读写
#-e指的是配置,官网上查。mysql没有配置密码启动不起来的。
docker run -d -p 3636:3306 -v /home/mysqldataaa:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
具/匿 名挂载
- 挂载的主机路径为:/var/lib/docker/volumes/xxxx/_data
-----------------------------------------------
匿名挂载:在-v挂载时,只指定要挂载的路径
docker run -it -v /home centos /bin/bash
用inspect命令可以看到以下内容:
"Mounts": [
{
"Type": "volume",
"Name": "26ab6abdde81755b4ba9f8bae57f1cc0644ce81136ac3d03d91e5e9384883a3d",
"Source": "/var/lib/docker/volumes/26ab6abdde81755b4ba9f8bae57f1cc0644ce81136ac3d03d91e5e9384883a3d/_data",
"Destination": "/home",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
-----------------------------------------------
具名挂载:在-v挂载时,给挂载路径起一个名字。注意名字前不能有/,否则为一个目录,就变成指定路径挂载了。
docker run -it -v myvolumn:/home centos /bin/bash
"Mounts": [
{
"Type": "volume",
"Name": "myvolumn",
"Source": "/var/lib/docker/volumes/myvolumn/_data",
"Destination": "/home",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
Dockerfile挂载
dockerfile文件:
FROM centos #说明用哪个镜像
VOLUME ["volume01","/home/volume02"] #匿名挂载
CMD echo "---end---"
CMD /bin/bash
操作:
------------------------------------------------------------------
-f代表用哪个文件, /home/test是用哪个目录下的dockerfile文件,文件名是dockerfile是必须存在的。
-f可以去掉的。
有-f会取代/home/test
-t代表目标
[root@MeowSir test]# docker build -f /home/test/dockerfile -t centosbyhao /home/test
Sending build context to Docker daemon 14.85kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","/home/volume02"]
---> Running in 8915dfae34a1
Removing intermediate container 8915dfae34a1
---> 772ec7abfa79
Step 3/4 : CMD echo "---end---"
---> Running in e7b82b551719
Removing intermediate container e7b82b551719
---> ce14cb33ff2f
Step 4/4 : CMD /bin/bash
---> Running in 7fb99913d79c
Removing intermediate container 7fb99913d79c
---> 1e27fa7b618c
Successfully built 1e27fa7b618c
Successfully tagged centosbyhao:latest
----------------------------------------------------------------
"Mounts": [
{
"Type": "volume",
从这里可以看到匿名挂载的影子
"Name": "5719f471a7b5d141a27b93d16e8cb346d9a215df0cef7e1eda957416fa6b633e",
"Source": "/var/lib/docker/volumes/5719f471a7b5d141a27b93d16e8cb346d9a215df0cef7e1eda957416fa6b633e/_data",
"Destination": "/home/volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "224651a4c0c4b7a805e43071c3d6c4bc697981eb4ee66c6c13d2f9cef7d60ca1",
"Source": "/var/lib/docker/volumes/224651a4c0c4b7a805e43071c3d6c4bc697981eb4ee66c6c13d2f9cef7d60ca1/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
容器数据卷
-
实现容器间数据的共享
-
d2b7df1c2a3a是要挂载的目标 docker run -it --volumes-from d2b7df1c2a3a centosbyhao
-
从docker inspect的命令中的Mounts属性看,两个容器挂载的目录还是主机中的同一目录
从portainer来看,确实:
2、DockerFile
用来构建镜像用的。使用这个后可以自定义镜像。
基本指令
docker build -f /home/test/dockerfile -t centosbyhao .
FROM #基础镜像
MAINTAINER #指明镜像作者,姓名<邮箱>
RUN #镜像构建时要运行的命令
ADD #在基础镜像上,添加内容。如果是压缩包,会自动解压
WORKDIR #指定工作目录。就是一进去控制界面时的益
VOLUME #挂载目录
EXPOSE #暴露的端口
CMD #要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #要运行的命令,可以追加
ONBUILD #
COPY #类似ADD,递铺镇文件拷贝到镜像中
ENV #添加环境变量。本质就是键值对
例子:自定义centos
dockerfile:
[root@MeowSir test] cat dockerfile
FROM centos
MAINTAINER MeowSir<123456@qq.com>
ENV MYPATH /bin/local #设置键值对
RUN yum -y install vim #安装vim
RUN yum -y install gcc #安装gcc
WORKDIR $MYPATH #指定工作路径。从环境变量中取
EXPOSE 8787
CMD echo $MYPATH
CMD echo "hello,my dad"
CMD /bin/bash #运行控制窗口
构建及结果:
[root@MeowSir test]# docker build -t mysuperos .
Sending build context to Docker daemon 2.048kB
Step 1/10 : FROM centos
---> 300e315adb2f
Step 2/10 : MAINTAINER MeowSir<123456@qq.com>
---> Running in 74cd57a59e8c
Removing intermediate container 74cd57a59e8c
---> e40397dbe80d
Step 3/10 : ENV MYPATH /bin/local
---> Running in 44db2c13376b
Removing intermediate container 44db2c13376b
---> bc9e0d821900
Step 4/10 : RUN yum -y install vim
x86_64 2.21-12.el8 baseos 49 k
Complete!
Removing intermediate container 186023b3b4f1
---> 364c83047bb9
Step 5/10 : RUN yum -y install gcc
Complete!
Removing intermediate container 732c02d41b0b
---> a6ca62248d4c
Step 6/10 : WORKDIR $MYPATH
---> Running in 362ca411d2c3
Removing intermediate container 362ca411d2c3
---> 89d607e50a64
Step 7/10 : EXPOSE 8787
---> Running in d401802e82e1
Removing intermediate container d401802e82e1
---> 714ac35fd12a
Step 8/10 : CMD echo $MYPATH
---> Running in f21cc4343f41
Removing intermediate container f21cc4343f41
---> 39215cde598e
Step 9/10 : CMD echo "hello,my dad"
---> Running in 99c3c69390de
Removing intermediate container 99c3c69390de
---> 21aa3a69f2f7
Step 10/10 : CMD /bin/bash
---> Running in f85de5084352
Removing intermediate container f85de5084352
---> 91bcd8288dc7
Successfully built 91bcd8288dc7
Successfully tagged mysuperos:latest
cmd与entrypoint区别
[root@MeowSir test] cat dockerfile
FROM centos
MAINTAINER MeowSir<123456@qq.com>
ENV MYPATH /bin/local #设置键值对
RUN yum -y install vim #安装vim
RUN yum -y install gcc #安装gcc
WORKDIR $MYPATH #指定工作路径。从环境变量中取
EXPOSE 8787
CMD ["ls","-a"] #区别
ENTRYPOINT ["ls","-a"] #区别
CMD echo "hello,my dad"
CMD /bin/bash #运行控制窗口
在docker run myimages ls -l ,cmd不会报错,而entrypoint会追加,然后报错。
又如docker run myimages -l ,cmd替换,报错;而entrypoint会追加成ls -al ,不会报错。
3、发布镜像
方式一:docker hub
-
在docker hub上注册账号
-
docker login -p -u docker push 跟下面阿里云一样,只是阿里云指定了路径而已。
方式二:阿里云
-
在阿里去管理平台上,创建命令空间及仓库
-
根据下面提示操作即可。要按照格式来。
-
- 登录阿里云Docker Registry
$ sudo docker login --username=ihapp**** registry.cn-shenzhen.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
- 从Registry中拉取镜像
$ sudo docker pull registry.cn-shenzhen.aliyuncs.com/namespacehao/testrepo:[镜像版本号]
- 将镜像推送到Registry
$ sudo docker login --username=ihapp**** registry.cn-shenzhen.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/namespacehao/testrepo:[镜像版本号] $ sudo docker push registry.cn-shenzhen.aliyuncs.com/namespacehao/testrepo:[镜像版本号]
-
推送成功后可以看到:
五、网络与集群
由于网络方面基础知识欠缺(大三才上计算机网络,也没能提前看相关知识),且目前上面所学的在现阶段完全够用了,故学习先暂止。