docker简介和常用命令“易读”
程序员文章站
2024-03-11 19:34:43
...
Docker容器理论部分
一)什么是容器
容器技术的核心有一下几个内核技术组成
- Cgroups(control Groups)-资源管理
控制你能使用多少系统资源(内存、cpu之类的)
- ELinux安全
- Namesqaces-进程隔离:六大命名空间
1、 封装应用
1.把一个服务提前配置好封装成一个容器,需要使用的时候直接倒出来就可以直接使用
2.比如一个Nginx刚刚下载时需要源码 编译 安装挺麻烦的,可以把他制作成rpm包,直接yum安装就可以使用了
3.容器和rpm包有点类似: rpm是管理文件 、 容器是封装应用的
2、Docker 核心技术与实现原理
- Docker有三大核心组件、六大命名空间
1)三大核心组件
1镜像
( 1)镜像是什么: 镜像是容器中最底层数据的块结构
( 2)镜像采用的分层设计,快照,cow技术确保底层数据只读不丢失
( 3)镜像是一个只读的静态模板,保存了容器需要的环境和应用的执行代码。镜像采用分层机制,每个镜像都是只读的,但可以将写数据的层通过联合文件系统附加到原有的镜像上。这样镜像就很易于存储、传输和更新。
( 4)查看镜像: [[email protected]]# docker images
( 5)Docker hub镜像创库: https://hub.docker.com
2、容器
( 1)容器是启动以后运行的实列,没有启动的时候是一个镜像
( 2)容器是基于镜像启动的
( 3)容器是一个运行时环境,是镜像的运行状态,是镜像执行的动态表现。容器提供了应用的统一的运行方式:创建、开始、停止、重启、销毁。
3、镜像仓库
Docker采用注册服务器来存储和共享用户的镜像,库是某个特定用户存储镜像的目录。通常一个用户可以建立多个库来保存自己的镜像。库是注册服务器的一部分,注册服务器分公有的和私有的,公有的如Docker官方提供的Docker Hub。
2)六大命名空间
- 六大命名空间的作用
1.如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件
2.一旦服务器上的某一个服务被入侵,那么入侵者就能够访问当前机器上的所有服务和文件,这也是我们不想看到的,而 Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离,独立。
- 六大命名空间的功能
1.uts 命名空间
命名空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。
2.mnt (Mount文件系统)命名空间
在这个文件系统所做的所有操作都不会影响到其他
类似 chroot,将一个进程放到一个特定的目录执行。 mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了
同 chroot 不同,每个命名空间中的容器在 /proc/mounts 的信息只包含所在命名空间的 mount point。
3.pid 命名空间
隔离出独立的进程空间
4.net 命名空间
( 1)有了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。
( 2)网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。
( 3)Docker 默认采用 veth(虚拟接口) 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。
5.ipc 命名空间(信号量、消息队列和共享内存)
进程间的通信:interprocess communication - IPC)比如信号 kill 给进程发信号
6.user 命名空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程
二、Docker持久化存储
-
Docker容器其实就是一个进程,那么这个进程的数据到底存储在哪里了呢 :存储卷
-
卷的概念
卷的概念
- Docker容器本身不保存任何数据,容器关闭数据就消失了
- 重要数据请使用外部卷存储(数据持久化)#存储卷就是个文件夹
- 容器可以挂载真实机目录或共享存储为卷
- Docker容器和真实机器的一个目录绑定实现共享存储
主机卷的映射
-将真实机目录挂载到容器中提供持久化存储
- 目录不存在就自动创建
- 目录存在就直接覆盖掉
- 将真实机的一个文件夹挂载到容器中使用的是'-v'这个参数
[[email protected] ~]# docker run -v /真实机器的文件夹目录:/容器里面的目录 -it
[[email protected] ~]# docker run -v /date:/data -it docker.io/centos
- 多台机器不同容器共享数据(NFS)
共享存储基本概念
- 一台共享存储服务器可以提供给所有Docker主机使用
- 共享存储服务器(NAS、SAN、DAS等)
- 如:
- 使用NFS创建共享存储服务器
- 客户端挂载NFS共享、并最终映射到容器中
备注:用的不多,一般情况用默认的就行
三、Docker网络拓扑
简单的网络拓扑
- 最基础的Docker网络拓扑
- 多个容器连接在一个docker虚拟交换机上
- 一个网络指的就是一个虚拟交换机
1、查看Docker默认网络模型
- 一般情况下使用桥接的比较多
- 桥不需要我们管理,Docker自己管理
- 查看Docker默认网络使用的命令
[[email protected] ~]# docker network
2、使用Docker创建网桥
- 要求:
- 容器1 与 容器2 能够互通
- 容器3 与 容器4 能够互通
- 容器(12) 与 容器(34) 不能互通
1、创建docker1虚拟交换机
[[email protected] ~]# docker network create --subnet=10.10.10.0/24 docker1 #//--subnet指定使用的网段
2、查看
[[email protected] ~]# docker network ls
3、创建容器,使用'docker1'虚拟交换机
[[email protected] ~]# docker run -itd --network=docker1 myos1:latest
容器1/2使用默认虚拟交换机
容器3/4开启使用'docker1'虚拟交换机
理论总结
Docker就是封装应用
相关理论问题
1.容器和虚拟机不同,虚拟机是完全隔离的,如果在虚拟机里面启动的所有服务应用都和真实机器基本没有关系 而Docker容器可以看作是一个封装的应用
2.为了方便快捷,将需要的服务,应用封装成一个应用(Docker镜像)当需要用到这个应用时,直接把这个应用(Docker容器)的端口和‘真机(宿主机)’绑定
3.默认容器可以访问外网, 但是外部网络(其他主机)不可以访问容器内的资源,服务,应用
4.容器的特征是可以把宿主机变成对应的服务(将真机的端口和容器的端口绑定)使用的参数是 -p 宿主机端口:容器
列如:把docker1服务器 变成httpd
docker run -itd -p 80:80 docker。Io/myos:httpd(以封装好的容器)
列如:把docker1服务器 变成Nginx
docker run -itd -p 80:80 docker。Io/nginx:latest(以封装好的容器)
5.将生产环境中的各种各样的应用(比如web的应用,NOSQL)封装成镜像
再将镜像创建成容器(应用)时加 -p 就相当于这个容器(应用)直接融入这个服务器中直接使用就可以了,后台只是多了些进程
6.假设,领导今天说了你需要部署10台的web集群,你只需要:
将封装好的镜像:创建成容器的同时加-p 绑定 真是服务器的端口和容器的端口就行了
7.所以Docker是弹性云
可以很快扩展出来,可以很快就关掉,可以把宿主机变成你需要各种各样的东西,只要你制作了这个镜像,那就想要什么run什么就完事了
所以大部分时间就可以把需要的各种各样的服务封装成Docker镜像,只要有Docker镜像想要什么run什么简单快捷方便实用。
Docker基本命令
-
Docker官方提供公共镜像的仓库
-
Docker hub镜像创库: https://hub.docker.com # Docker官方提供公共镜像的仓库(Registry)
-
官网下载, 或者知道镜像名字 搜索镜像
-
有OFFICIAL参数OK的 代表是官方的
-
STARS下载次数
- 在Docker中容器是基于镜像启动的
- 镜像是启动容器的核心
- 镜像采用分层设计
- 使用快照的COW技术,确保底层数据不丢失
镜像可以从官网下载,也可以自己做
1.官网下载
https://hub.docker.com # Docker官方提供公共镜像的仓库(Registry)
2.命令行下载
[[email protected] ~]# docker search busybox //搜索包含busybox的镜像
[[email protected] ~]# docker help pull //查看pull帮助,或man帮助
[[email protected] ~]# docker pull docker.io/busybox //下载镜像
[[email protected] ~]# docker images //查看镜像
REPOSITORY[名称] TAG[标签] IMAGE ID[ID] CREATED[时间] SIZE[大小]
docker.io/busybox latest b534869c81f0 5 days ago 1.22 MB
# 名称+标签=唯一的列出子命令
一、镜像常用命令
1、 [[email protected] ~]# docker images //查看镜像列表 #
2、 [[email protected] ~]# docker history //查看镜像制作历史,了解镜像制作过去 #
3、 [[email protected] ~]# docker inspect //查看镜像底层信息 #
4、 [[email protected] ~]# docker pull //下载镜像
5、 [[email protected] ~]# docker push //上传镜像
6、 [[email protected] ~]# docker rmi //删除本地镜像 #
7、 [[email protected] ~]# docker save //镜像另存为tar包 #
8、 [[email protected] ~]# docker load //使用tar包导入镜像 #
9、 [[email protected] ~]# docker search //搜索镜像
10、[[email protected] ~]# docker tag //修改镜像名称和标签
1、下载镜像
[[email protected] ~]# docker pull docker.io/nginx
2、上传镜像
[[email protected] ~]# docker push docker.io/nginx
3、查看镜像
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest d8233ab899d4 10 days ago 1.199 MB
镜像名称 标签 ID 创建时间 大小
4、查找busybox镜像
[[email protected] ~]# docker search docker.io/busybox
5、导出busybox镜像为busybox.tar #导入导出也叫备份与恢复
[[email protected] ~]# docker save docker.io/nginx:latest -o nginx.tar
[[email protected] ~]# ls
busybox.tar
6、导入镜像
[[email protected] ~]# scp nginx.tar [email protected]:/root
[[email protected] ~]# ls
nginx.tar
[[email protected] ~]# docker load -i nginx.tar
3c816b4ead84: Loading layer 58.47 MB/58.47 MB
787822cf1b17: Loading layer 54.44 MB/54.44 MB
89decbdf7fb7: Loading layer 3.584 kB/3.584 kB
Loaded image: docker.io/nginx:latest/3.584 kB
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 42b4762643dc 4 weeks ago 109.2 M e1ddd7948a1c 4 weeks ago 1.163 MB
7、删除镜像
[[email protected] docker]# docker rmi docker.io/nginx
8、一次性导入多个镜像
[[email protected] docker]# for i in * ; do docker load -i $i; done
二、容器常用命令
1、[[email protected] ~]# docker run //运行容器
2、[[email protected] ~]# docker ps //查看容器列表 参数 -a 、 -aq
3、[[email protected] ~]# docker stop //关闭容器
4、[[email protected] ~]# docker restart //重启容器
5、[[email protected] ~]# docker attach //进入容器、exit会导致容器关闭
6、[[email protected] ~]# docker exec //进入容器、退出时不会导致容器关闭
7、[[email protected] ~]# docker inspect //查看容器底层信息
8、[[email protected] ~]# docker top //查看容器进程列表
9、[[email protected] ~]# docker rm //删除容器
1、启动镜像
启动centos镜像生成一个容器
[[email protected] ~]# docker run -itd -p docker.io/centos /bin/bash
[[email protected] /]# ls /
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[[email protected] /]# cd /etc/yum.repos.d/
[[email protected] yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Sources.repo CentOS-fasttrack.repo
CentOS-CR.repo CentOS-Media.repo CentOS-Vault.repo
[[email protected] yum.repos.d]# rm -rf C*
[[email protected] yum.repos.d]# ls
[[email protected] yum.repos.d]#vi dvd.repo //在容器里面配置一个yum源
[local]
name=local
baseurl=ftp://192.168.1.254/system
enable=1
gpgcheck=0
[[email protected] yum.repos.d]# yum -y install net-tools //安装软件
[[email protected] yum.repos.d]# exit
exit
docker run 的参数有
-i :表示交互式
-t :表示终端
-d :将它作为一个守护进程放入后台运行
-v :将真机的目录和容器的目录绑定,实现数据持久化
-p :宿主机端口:容器 将真机的端口和容器的端口绑定
2、镜像与容器常用指令
1、查看后台运行的容器
[[email protected] ~]# docker run -itd -p docker.io/nginx //启动nginx的镜像
[[email protected] ~]# docker ps //查看后台运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81458156f6e8 docker.io/nginx "nginx -g 'daemon off" 9 seconds ago Up 8 seconds 80/tcp pedantic_goldberg
只显示容器ID
[[email protected] ~]# docker ps -q
81458156f6e8
显示所有的容器,包括没有启动的
[[email protected] ~]# docker ps -a
显示所有的容器ID
[[email protected] ~]# docker ps -qa
81458156f6e8
3656f1978967
2、查看centos镜像历史(制作过程)
[[email protected] ~]# docker history docker.io/centos
3、删除镜像,启动容器时删除镜像会失败,先关闭容器,再删除容器,再删除镜像
[[email protected] ~]# docker stop 81 #81的意思是ID只要不重复,只写前面两个id号是没有问题的
81
[[email protected] ~]# docker rm 81
81
[[email protected] ~]# docker rmi docker.io/nginx //删除nginx镜像
4、关闭/启动/重启容器
[[email protected] ~]# docker stop 0f //0f为容器ID
0f
[[email protected] ~]# docker start 0f
0f
[[email protected] ~]# docker restart 0f
0f
5、连接容器
[[email protected] ~]# docker attach [ID] #退出时会关闭容器
[[email protected] ~]# docker exec -it [ID] #退出时不会关闭容器
6、查看容器进程列表
[[email protected] ~]# docker top
7、快捷删除容器
默认只删除没有在运行的容器
[[email protected] ~]# docker rm $(docker stop 4848cdf82d53) #前一个命令执行的结果最为后一个命令的参数
[[email protected] ~]# docker rm $(docker ps -aq) #ps -aq列出所有容器的ID 然后删除所有
自定义镜像
一、 docker commit
-
使用镜像启动容器(等于创建一个前段盘)
-
镜像:一个后端盘,然后创建前端盘,在前端盘里做配置,然后把这个整体打一个tar包,这就是一个新的镜像(自定义镜像)
-
.制作完成后也可以删除之前容器
-
.查看底层信息 docker history myos:latest
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7WxUCMP-1583213964295)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200301124908973.png)]
docker commit:
[[email protected] ~]# docker run -it docker.io/centos:latest /bin/bash
[[email protected] /]# rm -rf /etc/yum.repos.d/*.repo
[[email protected] /]# cat > /etc/yum.repos.d/local.repo <<EOF
> [local_repo]
> name=CentOS-$releasever - Base
> baseurl="ftp://192.168.1.254/centos-1804"
> enabled=1
> gpgcheck=0
> EOF
[[email protected] /]# yum repolist
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
local_repo | 3.6 kB 00:00
(1/2): local_repo/group_gz | 166 kB 00:00
(2/2): local_repo/primary_db | 5.9 MB 00:00
repo id repo name status
local_repo CentOS- - Base 9911
repolist: 9911
[[email protected] /]# yum -y install bash-com* //在容器中下载几个常用软件包
[[email protected] /]# yum -y install net-tools
[[email protected] /]# yum -y install vim
[[email protected] /]# yum -y install psmisc
[[email protected] /]# yum -y install iproute
[[email protected] ~]# docker ps -a //查看容器名称对应的容器ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fc74c6a9d1f docker.io/centos:latest "/bin/bash" 15 minutes ago Exited (0) 5 minutes ago romantic_lalande
[[email protected] ~]# docker commit 4fc74c6a9d1f myos:latest
//通过上一条命令的结果查看到容器ID,另生成一个经过修改的镜像
[[email protected] ~]# docker run -it myos:latest //运行新生成的镜像
[[email protected] /]# ifconfig //可以看到命令,不用再安装
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
..... ......
[[email protected] /]# exit
[[email protected] ~]# docker history myos:latest
//查看容器历史创建,基于76d6bc25b8a5创建了一个855934bb3026的镜像
IMAGE CREATED CREATED BY SIZE COMMENT
855934bb3026 6 minutes ago /bin/bash 171.9 MB
76d6bc25b8a5 14 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 14 months ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
<missing> 14 months ago /bin/sh -c #(nop) ADD file:8f4b3be0c1427b158f 199.7 MB
二、Dockerfile
Dockerfile: 可以理解为编排镜像的脚本语言
1.FROM :基础镜像 ,相当于我们的后端盘
2.MAINTAINER:镜像创建者信息
3.ENV:设置变量,运行环境
4.RUN:制作镜像时执行的命令 #在容器内执行的命令
5.ADD: 复制文件到镜像 有自动解包的功能 当前路径 #容器内路径 (当前路径:只能在Dockerfile下-->相 对路径)
6.EXPOSE:开放端口 #标识监听的端口号
7.WORKDIR:定义容器默认工作目录,永久改变默认工作目录(每次进入容器,都会到指定工作目录) (当前路径:只能 在Dockerfile下-->相对路径)
8.CMD格式不支持空格,可以用,隔开 ps:CMD ["/bin/ls", "-al"] .CMD ["/usr/bin/python"] //修 改默认启动命令,做服务镜像用(比如nginx)
制作一个centos镜像
[[email protected] ~]# mkdir abc
[[email protected] ~]# cd abc/
[[email protected] abc]# vim Dockerfile
FROM docker.io/centos:latest #创建第一个后端盘
RUN rm -rf /etc/yum.repos.d/*.repo #在容器内执行的命令
ADD local.repo /etc/yum.repos.d/local.repo #复制文件到镜像
RUN yum -y install bash-completion net-tools vim psmisc iproute
[[email protected] abc]# cp /etc/yum.repos.d/local.repo ./ 将本地的yum源拷贝到当前目录
[[email protected] abc]# ls
Dockerfile local.repo
-t名称标签
[[email protected] abc]# docker build -t centos:latest . //要加一个点.是Dockerfile所在目录
[[email protected] abc]# docker run -itd centos:latest
# ADD是复制本地文件到容器里但这个文件只支持在当前路径下
制作一个ssh镜像
ssh服务封装:如果Dockerfile文件不会写可以自己手动做一遍再将命令复制到Dockerfile里,再修改一下
1、进入myos:latest容器
[[email protected] ~]# docker start ae024160d57d
[[email protected] ~]# docker attach ae024160d57d
2、搜索ssh软件包
[[email protected] /]# yum search ssh
[[email protected] /]# yum -y install openssh-server
3、起服务
systemctl start sshd # 这个命令是告诉systemd帮我起这个服务,pstree可以看到sshd这个服务是由systemd启动的子进程,但在容器里他的上帝进程不是systemd 调用不了systemctl这个命令,所以在容器里需要自己启动服务
#systemd起ssh服务也是靠sshd.service起的服务
[[email protected] /]# rpm -ql openssh-server | grep sshd # 可以查看ssh服务安装后生成的文件
.....
/usr/lib/systemd/system/sshd.service # 这个文件里可以看见ssh的变量及启动服务路径
.....
[[email protected] /]# SSH_USE_STRONG_RNG=0
[[email protected] /]# /usr/sbin/sshd", "-D" #报错没有公私钥
[[email protected] /]# sshd-****** //生成公钥,但会报错,说没有这个文件[软件包装少了]
/usr/sbin/sshd-******: line 10: /etc/rc.d/init.d/functions: No such file or directory
[[email protected] /]# yum provides /etc/rc.d/init.d/functions
//查看这个文件由那个软件包生成
initscripts-9.49.41-1.el7.x86_64 : The inittab file and the /etc/init.d scripts
[[email protected] /]# yum -y install initscripts
以上是创建ssh服务的过程
----------------------------------------------------------------------
可以选择将历史命令放入Dockerfile文件里
[[email protected] ~]# mkdir xx
[[email protected] ~]# cd xx/
[[email protected] xx]# vim Dockerfile
FROM myos:latest
RUN yum -y install openssh-server initscripts
RUN echo "a" | passwd --stdin root && sshd-******
ENV SSH_USE_STRONG_RNG=0
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
[[email protected] xx]# docker build -t myos:sshd .
制作一个Nginx镜像
docker run -it docker.io/centos:latest
在镜像中安装nginx,做好想要的配置(Dockerfile)
mkdir /mynginx
cd /mynginx
cp /etc/yum.repos.d/local.repo .
cp /root/nginx-1.10.tar.gz .
vim Dockerfile
FROM docker.io/centos:latest
EXPOSE 80
EXPOSE 443
COPY loacl.repo /etc/yum.repos.d/local.repo
COPY nginx-1.10.tar.gz /usr/local/
RUN yum -y install gcc make pcre zlib zlib-devel openssl-devel
RUN tar -xf /usr/local/nginx-1.10.tar.gz
RUN rm -rf /usr/local/nginx-1.10.tar.gz
WORKDIR /usr/src/nginx-1.10
RUN /usr/src/nginx-1.10/configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_realip_module \
--with-pcre \
--with-http_ssl_module \
--with-stream
RUN make && make install
COPY ./nginx.conf /usr/local/nginx/conf/
WORKDIR /usr/local/nginx
RUN rm -rf /usr/src/nginx-1.10
CMD ["/usr/local/nginx/sbin/nginx"]
docker build -t nginx:latest