Docker概述
什么是容器
容器技术已经成为应用程序封装和交付的核心技术
容器的技术核心有以下几个内核技术组成:
1.Cgroup(Control Groups)-资源管理
2.NameSpace-进程隔离
3.SELinux安全
由于是在物理机上实施隔离,启动一个容器,可以像启动一个进程一样快速
(进程隔离,也叫命名空间)1.主机名命名空间
2.网络命名空间,更改ip,不影响宿主的实时登录
3.文件系统命名空间
4.进程命名空间,只能看见自己的进程,别人的进程隔离开,看不到
5.信号向量进程空间(kill -l ,可以查看进程信号),信号隔离
6.用户隔离,可以让不同的命名空间里有不同的用户
什么是Docker
Docker是完整的一套容器管理系统(本来开源免费,现在有社区版和企业版,且社区吧有问题多多)
Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术
作用是很方便的使用命令创建容器,而不需要过多的了解内核技术
Docker特性
优点:可以没有操作系统,容器更加简洁高效,使用的共享公共库和程序(容器的系统都是底层一个)
缺点:隔离性没有虚拟化强,共用Linux内核,安全性有先天缺陷,SELinux难以驾驭,监控容器和容器拍错是挑战
安装至少需要64位操作系统(推荐RHEL7以上),关闭防火墙(不是必须,但是安装Docker会生成防火墙,监管,不了解防火墙的,防火墙必须关掉)
部署Docker
安装软件
配置yum源,Docker软件包位于光盘RHEL7-extras.iso中
利用ftp共享挂载
在虚拟机中配置yum源,指向ftp共享的extras目录
[root@docker1 ]# vim /etc/yum.repos.d/rhel.repo
...
[local_extras]
name=CentOS-$releasever - Extras
baseurl="ftp://192.168.1.254/extras"
enabled=1
gpgcheck=0
更改静态ip为192.168.1.31/32
安装Docker软件
yum -y install docker
systemctl restart/enable docker
关闭防火墙
Docker镜像
什么是镜像
在Docker中容器是基于镜像启动的,镜像是启动容器的核心,采用分层设计,使用快照的COW技术,确保底层数据不丢失(镜像是个整体,而且是只读的,操作都是在容器中进行)
Docker hub镜像仓库
HTTps://hub.docker.com (Docker官方公共镜像的仓库Registry)
命令行下载:docker search +软件包名(软件包镜像文件,例nginx,busybox,centos)
搜索出的包名(OFFICIAL列,是否由官方提供),复制NAME名,全复制
Docker pull +NAME名
docker images 查看已有的仓库镜像文件
[root@docker1 ~]# docker search busybox
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/busybox Busybox base image. 1696 [OK]
docker.io docker.io/progrium/busybox 71 [OK]
docker.io docker.io/radial/busyboxplus Full-chain, Internet enabled, busybox made... 25 [OK]
docker.io docker.io/arm32v7/busybox Busybox base image. 7
docker.io docker.io/armhf/busybox Busybox base image. 5
docker.io docker.io/yauritux/busybox-curl Busybox with CURL 5
docker.io docker.io/arm64v8/busybox Busybox base image. 3
docker.io docker.io/aarch64/busybox Busybox base image. 2
docker.io docker.io/arm32v6/busybox Busybox base image. 2
docker.io docker.io/armel/busybox Busybox base image. 2
docker.io docker.io/i386/busybox Busybox base image. 2
docker.io docker.io/joeshaw/busybox-nonroot Busybox container with non-root user nobody 2
docker.io docker.io/odise/busybox-curl 2 [OK]
docker.io docker.io/p7ppc64/busybox Busybox base image for ppc64. 2
docker.io docker.io/prom/busybox Prometheus Busybox Docker base images 2 [OK]
docker.io docker.io/s390x/busybox Busybox base image. 2
docker.io docker.io/sequenceiq/busybox 2 [OK]
docker.io docker.io/ppc64le/busybox Busybox base image. 1
docker.io docker.io/spotify/busybox Spotify fork of https://hub.docker.com/_/b... 1
docker.io docker.io/amd64/busybox Busybox base image. 0
docker.io docker.io/arm32v5/busybox Busybox base image. 0
docker.io docker.io/concourse/busyboxplus 0
docker.io docker.io/ggtools/busybox-ubuntu Busybox ubuntu version with extra goodies 0 [OK]
docker.io docker.io/sou856099/busybox 0
docker.io docker.io/trollin/busybox 0
[root@docker1 ~]# docker pull docker.io/busybox
Using default tag: latest
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
7c9d20b9b6cd: Pull complete
Digest: sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e
[root@docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 19485c79a9bb 5 weeks ago 1.22 MB
镜像操作
下载镜像(从镜像仓库中下载镜像) Docker help pull(查看下载命令),man docker-pull
上传镜像(上传镜像到仓库)Docker help push (查看上传命令)
导出镜像 (将本地镜像导出为tar文件) docker save +镜像名:标签 -o 镜像名.tar(相当于备份)
导入镜像(通过tar包文件导入镜像): scp 镜像名.tar root@192.168.1.32;/root/(拷贝恢复镜像)
docker load -i + 镜像ming.tar
docker images
存在很多镜像文件时,备份必须是镜像名:标签+.tar
启动镜像
启动Centos镜像生成一个容器Docker images ,docker run -it docker.io/centos:latest /bin/bash(执行指令必须是容器里有这个启动命令,而不是承载的系统的启动命令,可以不加此项,用的是镜像默认启动命令) -itd (放入后台运行)
开启另一个终端(查看容器信息),docker ps(相当于virsh list)
完整的镜像名(镜像名:镜像标签)
Docker基本命令
命令列表:docker images #查看镜像列表
docker history #查看镜像制作历史
docker inspect #查看详细信息(可以加容器,或者镜像)
docker pull/push #下载/上传镜像
docker rmi #删除本地镜像
docker save #镜像另存为tar包,相当于备份
docker load #使用tar包导入镜像
docker search #搜索镜像(网络搜索)
docker tag #修改镜像名称和标签(类似创建硬链接)
docker images 查看镜像列表 -镜像仓库名称 -镜像标签 -镜像ID -创建时间 -大小
[root@docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/busybox latest 19485c79a9bb 5 weeks ago 1.22 MB
docker history 查看镜像历史 -了解镜像制作过程 -详细参考后面的dockerfile内容
[root@docker2 ~]# docker history abc:latest
IMAGE CREATED CREATED BY SIZE COMMENT
42b4762643dc 8 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon 0 B
<missing> 8 months ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0 B
<missing> 8 months ago /bin/sh -c #(nop) EXPOSE 80 0 B
<missing> 8 months ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx/ 0 B
<missing> 8 months ago /bin/sh -c set -x && apt-get update && apt- 53.9 MB
<missing> 8 months ago /bin/sh -c #(nop) ENV NJS_VERSION=1.15.8.0.2 0 B
<missing> 8 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.15.8-1 0 B
<missing> 8 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Doc 0 B
<missing> 8 months ago /bin/sh -c #(nop) CMD ["bash"] 0 B
<missing> 8 months ago /bin/sh -c #(nop) ADD file:a65337a57a064a79ad 55.28 MB
docker inspect 查看镜像底层信息 -了解镜像环境变量、存储卷、标签、默认启动命令等信息
[root@docker2 ~]# docker inspect abc:latest
[
{
"Id": "sha256:42b4762643dcc9bf492b08064b55fef64942f055f0da91289a8abf93c6d6b43c",
"RepoTags": [
"abc:latest",
"docker.io/nginx:latest"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "2019-01-22T23:27:32.707341021Z",
"Container": "b286effbae9a81971c40c928ca15a4c12d9690f304a0902f05267d1105abd38a",
"ContainerConfig": {
"Hostname": "b286effbae9a",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.15.8-1~stretch",
"NJS_VERSION=1.15.8.0.2.7-1~stretch"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"ArgsEscaped": true,
"Image": "sha256:631adb2ddcd756d307cc597477ed3cd2bba366278bfdcf3ab822f9dd47850d9c",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
},
"StopSignal": "SIGTERM"
},
"DockerVersion": "18.06.1-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.15.8-1~stretch",
"NJS_VERSION=1.15.8.0.2.7-1~stretch"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"ArgsEscaped": true,
"Image": "sha256:631adb2ddcd756d307cc597477ed3cd2bba366278bfdcf3ab822f9dd47850d9c",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
},
"StopSignal": "SIGTERM"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 109182523,
"VirtualSize": 109182523,
"GraphDriver": {
"Name": "devicemapper",
"Data": {
"DeviceId": "5",
"DeviceName": "docker-253:1-37748835-9344ab75033b512855c8aa7362317ae5a23d32c67264811ef44674cfa1a9c2a0",
"DeviceSize": "10737418240"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:3c816b4ead84066ec2cadec2b943993aaacc3fe35fcd77ada3d09dc4f3937313",
"sha256:787822cf1b17268c7ad2114a7f58fb2743387a5e183815f3f0f1a8a109d33e07",
"sha256:89decbdf7fb7815678e6f46c9035cdc5c04aeaa1ef63469403d777d5fd14abb8"
]
}
}
]
docker rmi 删除本地镜像(需先删除镜像启动的容器,才能删除镜像) -注意:启动容器时删除镜像会提示错误
[root@docker1 ~]# docker rmi docker.io/nginx:latest
Error response from daemon: conflict: unable to remove repository reference "docker.io/nginx:latest" (must force) - container 0fd43ff54085 is using its referenced image 42b4762643dc
docker tag 重命名镜像名称(复制改名,没有创建新的镜像),默认标签都是latest
[root@docker2 ~]# docker tag docker.io/centos:latest bcd:latest
[root@docker2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
abc latest 42b4762643dc 8 months ago 109.2 MB
docker.io/nginx latest 42b4762643dc 8 months ago 109.2 MB
docker.io/ubuntu latest 20bb25d32758 8 months ago 87.47 MB
bcd latest 76d6bc25b8a5 12 months ago 199.7 MB
docker.io/centos latest 76d6bc25b8a5 12 months ago 199.7 MB
容器常用命令
命令列表: -docker run #运行容器 (后面跟容器id,一般前四位唯一,四位即可代表容器)
-docker ps #查看容器列表 -a显示所以(all)
-docker stop #关闭容器
-docker start #启动容器
-docker restart #重启容器
-docker attach|exec #进入容器
-docker inspect #查看容器底层信息
-docker top #查看容器进程列表
-docker rm #删除容器(删除时,容器必须是停止运行的)
ps -ef | grep sleep #查看某一进程
docker attach|exec 都是进入容器
docker attach 进入容器,exit会导致容器关闭(保错维护用),上帝进程进入,进入后可以ctrl+p+q放入后台
docker exec 进入容器,退出时不会关闭容器(日常维修用),产生一个子进程
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8338102489e docker.io/centos:latest "/bin/bash" 29 minutes ago Up 29 minutes happy_morse
84e2a84e07bb docker.io/redis:latest "docker-entrypoint.sh" 30 minutes ago Up 30 minutes 6379/tcp elated_mayer
e47f2d62d51a docker.io/busybox:latest "sh" 32 minutes ago Up 32 minutes evil_dijkstra
[root@docker1 ~]# docker attach e47f2d62d51afb7ea2e1c7a0e4f439703e5291b0f9b708496958cb19c177df54
/ # exit
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8338102489e docker.io/centos:latest "/bin/bash" 29 minutes ago Up 29 minutes happy_morse
84e2a84e07bb docker.io/redis:latest "docker-entrypoint.sh" 31 minutes ago Up 31 minutes 6379/tcp elated_mayer
[root@docker1 ~]# docker exec -it d833 bash
[root@d8338102489e /]# exit
exit
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8338102489e docker.io/centos:latest "/bin/bash" 32 minutes ago Up 32 minutes happy_morse
84e2a84e07bb docker.io/redis:latest "docker-entrypoint.sh" 33 minutes ago Up 33 minutes 6379/tcp elated_mayer
–>iproute ifconfig–>net-tools pstree–>psmisc
docker top #查看容器进程列表
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84e2a84e07bb docker.io/redis:latest "docker-entrypoint.sh" 54 minutes ago Up 54 minutes 6379/tcp elated_mayer
[root@docker1 ~]# docker top 84e2
UID PID PPID C STIME TTY TIME CMD
polkitd 26316 26300 0 15:57 pts/2 00:00:02 redis-server *:6379
linux系统分,redhat(市场占额70%),debian(占28%,ubuntu系统,用法和redhat系统差不多,除rpm和yum命令不同,对应的是dpkg和qpt-get命令,包名为.deb结尾,文件存放也没有太大区别),other(占2%)
nginx镜像容器如何配置web页面
docker run -itd docker.io/nginx #放入后台
docker exec -it id值 //bin/bash #进入
apt -l #查看以安装的软件
nginx -T #查看nginx相关配置文件路径
写首页文件
退出后,docker inspect id号,查看容器ip地址
curl http://IP地址,访问即可
centos镜像容器如何配置web页面
docker run --privileged -itd docker.io/centos /usr/sbin/bash #提权进入并放入后台
docker exec -it id值 /bin/bash #子进程进入
配置yum源,装包(httpd,iproute,psmisc,net-tools等)
查看httpd启动命令cat /usr/lib/systemd/system/httpd.service
启动http ctrl+p+q 放入后台,写网页文件,退出访问即可