docker 容器
docker 简介
首先呢,docker是个容器,就是将你的应用跑在物理机之上,给你扩容出来的一些资源。那么他与kvm有什么不同呢?其实就是在于分配资源的形式不同,kvm是基于硬件资源的分配实际上是物理机上运行虚拟机再开应用的一个过程,而docker是基于kernel内存级别的资源隔离。
docker的过程简单概括为,构建--运输--运行,是c/s架构,它的组件是镜像,容器,仓库
安装Docker与加速器配置
Docker CE支持64位版本CentOS 7,并且要求内核版本不低于3.10。 CentOS 7满足最低内核的要求,如果你之前安装过docekr,或者安装了老版本的docker,建议先卸载掉。旧版本的 Docker称为docker或者 docker-engine,使用以下命令卸载旧版本: [root@localhost ~]# yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 接着,使用yum在线安装Docker CE,执行以下命令安装依赖包: [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 鉴于国内网络问题,强烈建议使用国内源,执行下面的命令添加yum软件源: [root@localhost ~]# yum-config-manager \ --add-repo \ https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo 最后,可以安装Docker CE了。 [root@localhost ~]# yum makecache fast [root@localhost ~]# yum install docker-ce 最后,启动 Docker CE: [root@localhost ~]# systemctl enable docker [root@localhost ~]# systemctl start docker 1、建立docker用户组 默认情况下,docker命令会使用Unix socket与Docker引擎通讯。而只有root用户和docker组的用户才可以访问Docker引擎的Unix socket。出于安全考虑,一般Linux系统上不会直接使用root用户。因此,更好地做法是将需要使用docker的用户加入docker用户组。因此,首先建立docker组: [root@localhost ~]# groupadd docker 将当前用户加入 docker 组: [root@localhost ~]# usermod -aG docker $USER 2、测试 Docker 是否安装正确 [root@localhost ~]# docker run hello-world 若能正常输出“Hello from Docker!”以上信息,则说明安装成功。 镜像加速配置 国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务 3、可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件) { "registry-mirrors": [ "https://registry.docker-cn.com" ] } 注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。之后重新启动服务。 [root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl restart docker 配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行docker info,如果从结果中看到了如下内容,说明配置成功。 [root@localhost home]# docker info ...... Registry Mirrors: https://registry.docker-cn.com/ Live Restore Enabled: false Product License: Community Engine
镜像
镜像是最基础的,我们的容器构建都是在此基础之上
# 安装docker [root@Poppy ~]# yum install docker -y [root@Poppy ~]# systemctl start docker [root@Poppy ~]# docker pull centos Using default tag: latest Trying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos 7dc0dca2b151: Pull complete Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322 Status: Downloaded newer image for docker.io/centos:latest # 查看镜像文件 [root@Poppy ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos latest 49f7960eb7e4 4 weeks ago 200 MB docker.io 官网的仓库,centos刚才咱们pull的镜像 # 网络比较慢的时候 导出镜像 [root@Poppy ~]# docker save 49f7960eb7e4 > /tmp/centos.tar.gz # 导入镜像 [root@Poppy ~]# docker load < /tmp/centos.tar.gz # 命令解释 docker pull 其实类似git pull,它是从dockerhub上面下载,这里面是一些开发人员,运维人员制作的镜像 docker images 列出机器上所有镜像 repository 仓库 标签 image id是唯一的 创建时间 大小 docker rmi 删除镜像,可以通过image id 如果这个镜像创建了容器是不会被删除的
容器
创建容器
# 不指定名字创建容器 [root@Poppy ~]# docker run centos /bin/echo "haha" /bin/echo "haha" 命令,如果没有写默认就是/bin/bash 1. 运行完退出了 2. 容器没有指定名字 # 查看容器运行 [root@Poppy ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0a1620b2b5b6 centos "/bin/echo haha" 38 seconds ago Exited (0) 37 seconds ago 容器id 唯一 镜像 命令 创建时间 状态 端口 名字 自动生成一个名称 # 指定名字的容器 [root@Poppy ~]# docker run --name mydocker -t -i centos /bin/bash -t 分配一个伪终端tty -i 容器的标准输入打开状态 执行一个命令,这个命令就是/bin/bash [root@3da840f13444 /]# ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 11820 1888 ? Ss 05:58 0:00 /bin/bash 容器的主机名就是容器的id [root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3da840f13444 centos "/bin/bash" 3 minutes ago Up 3 minutes 首先看看本地images有没有centos镜像,如果没有就从dockerhub给你下,利用centos镜像给你启动了一个容器
退出容器
# 因为退出了/bin/bash,一个容器启动时候只能指定一个进程,这个进程退出了,生命周期结束了,容器也就结束了,所以容器适合单进程的一个东西。例如 [root@Poppy ~]# docker start 3da840f13444 3da840f13444 [root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3da840f13444 centos "/bin/bash" 10 minutes ago Up 10 minutes mydocker [root@Poppy ~]# docker attach 3da840f13444 [root@3da840f13444 /]# exit exit [root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS # 我们看到了attach进入容器之后,退出的话,容器也就结束了,我们可以用nsenter进入容器,在退出是不会退出容器的,会在后台运行 # nsenter 安装
yum install util-linux
可以访问到一个名字空间
要知道pid
[root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@Poppy ~]# docker start 3da840f13444 3da840f13444 [root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3da840f13444 centos "/bin/bash" 14 minutes ago Up 5 seconds mydocker [root@Poppy ~]# docker inspect --format "{{.State.Pid}}" 3da840f13444 获取容器进程id 19353 [root@Poppy ~]# nsenter --help -t, --target <pid> target process to get namespaces from -u, --uts[=<file>] enter UTS namespace (hostname etc) -i, --ipc[=<file>] enter System V IPC namespace -n, --net[=<file>] enter network namespace -p, --pid[=<file>] enter pid namespace [root@Poppy ~]# nsenter -t 19353 -u -i -n -p [root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3da840f13444 centos "/bin/bash" 20 minutes ago Up 5 minutes 还在运行
用脚本进入容器
[root@Poppy ~]# cat ns.sh #!/bin/bash #PID=$(docker inspect --format "{{.State.Pid}}" $1) PID=`docker inspect --format "{{.State.Pid}}" $1` nsenter -t $PID -u -i -n -p [root@3da840f13444 ~]#
删除容器
[root@Poppy ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3da840f13444 centos "/bin/bash" 26 minutes ago Up 11 minutes mydocker 0a1620b2b5b6 centos "/bin/echo haha" 30 minutes ago Exited (0) 30 minutes ago zen_mccarthy [root@Poppy ~]# docker rm 0a1620b2b5b6 0a1620b2b5b6 [root@Poppy ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3da840f13444 centos "/bin/bash" 26 minutes ago Up 11 minutes 删除正在运行的需要 -f参数,一般不会这么干 # 还有一种方法就是在我们启动容器之后执行完命令自动删除 [root@Poppy ~]# docker run --rm centos /bin/echo "haha" haha [root@Poppy ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3da840f13444 centos "/bin/bash" 28 minutes ago Up 14 minutes # 杀死全部正在的容器进程 # 获取所有运行的容器的id [root@Poppy ~]# docker ps -a -q 3da840f13444 docker kill $(docker ps -a -q)
网络访问
1. 随机映射。 -p
2. 指定端口映射
默认docker会使用一个端口映射,让容器里面的端口对外
[root@Poppy ~]# ifconfig docker0
我们下载一个nginx镜像,然后启动一个容器,然后访问这个nginx,通过不指定端口运行
[root@Poppy ~]# docker pull nginx -d: 后台运行容器,并返回容器ID [root@Poppy ~]# docker run -d -P nginx b9cf97f289630651465fcb3ec492f32c5ea995889378d650d867f5d94bd04e59 [root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9cf97f28963 nginx "nginx -g 'daemon ..." About a minute ago Up About a minute 0.0.0.0:32768->80/tcp adoring_shaw 本台机子的32768端口映射到容器的80端口 [root@joker ~]# curl dock_nginx_ip:32768 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> # 容器日志 [root@Poppy ~]# docker logs b9cf97f28963 客户端IP - - [04/Jul/2018:06:54:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
我们通过指定端口运行
[root@Poppy ~]# docker run -d -p 81:80 nginx 71a13b6bfe19b9748b5f3c3b09a8da4f27ee20db56992e5e5accc10af2feb07e [root@joker ~]# curl docker_nginx_ip:81 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
存储
数据卷
[root@Poppy ~]# docker run -it --name volume-test1 -v /data centos [root@93955824a183 /]# ls -l /data/ total 0 # 查看容器机的物理位置 [root@Poppy ~]# docker inspect volume-test1 "Mounts": [ { "Type": "volume", "Name": "b2d9bd6b3d85ab087ac2952076f12b5401d636646f308950941f686a6ae73d68", "Source": "/var/lib/docker/volumes/b2d9bd6b3d85ab087ac2952076f12b5401d636646f308950941f686a6ae73d68/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], 我们创建一个文件,看是否同步 [root@Poppy _data]# touch 123 [root@Poppy _data]# pwd /var/lib/docker/volumes/b2d9bd6b3d85ab087ac2952076f12b5401d636646f308950941f686a6ae73d68/_data [root@93955824a183 /]# ls -l /data/ total 0 -rw-r--r-- 1 root root 0 Jul 4 07:13 123 # 有点像nfs,是通过mount方式挂上去的,类似nfs # 指定目录的挂载 [root@Poppy ~]# docker run -it -v /opt:/opt centos [root@1bc44740396e /]# ls /opt/ daima # 挂在时候还可以指定权限 /opt:/opt:ro ro只读 rw读写 # 可以单独挂载文件 [root@Poppy ~]# docker run -it -v ~/.bash_history:/.bash_history centos [root@e1700ba30895 /]# history 1 history [root@e1700ba30895 /]# ll [root@e1700ba30895 /]# history 1 history 2 ll 3 history 挂文件必须指定文件觉得路径~/ns.sh,然后是容器的地址 [root@Poppy ~]# docker run -it -v ~/ns.sh:/ns.sh centos
数据卷容器
我们说的数据卷就是在创建容器的时候指定了一个目录,而这个目录会映射到宿主机的某个位置上,而数据卷容器其实就是共享容器的数据卷
[root@Poppy ~]# docker run -d --name nfs -v /data centos 2e3ad584167e7e7c847cc372080d2c77920d92d6930e836b20bb75b3d122ab23 [root@Poppy ~]# docker run -it --name test2 --volumes-from nfs centos [root@41f117a8b203 /]# ls /data/ nfs [root@Poppy ~]# docker inspect 2e3ad584167e "Mounts": [ { "Type": "volume", "Name": "21b12652cd9359374462b252df317e0481c708f6150996588f3b29d2154e612f", "Source": "/var/lib/docker/volumes/21b12652cd9359374462b252df317e0481c708f6150996588f3b29d2154e612f/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], # 我们在nfs [root@Poppy ~]# cd /var/lib/docker/volumes/21b12652cd9359374462b252df317e0481c708f6150996588f3b29d2154e612f/_data [root@Poppy _data]# ls [root@Poppy _data]# touch hello # 在看test2的/data目录 [root@41f117a8b203 /]# ls /data/ hello 可以看出他们共用一个 数据卷容器可以停,内容依然共享
手动构建容器
首先你会有基础镜像,也就是操作系统
我们手动创建一个nginx容器
# 基础镜像 centos [root@Poppy ~]# docker pull centos # 创建仓容器 [root@Poppy ~]# docker run --name mynginx -it centos https://mirrors.aliyun.com/epel/ 选择7 复制链接地址 [root@694e6ee2153b /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm [root@694e6ee2153b /]# yum install -y nginx [root@694e6ee2153b /]# exit [root@Poppy ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 694e6ee2153b centos "/bin/bash" 4 minutes ago Exited (0) 16 seconds ago mynginx 记下id,基于这个容器做个镜像 [root@Poppy ~]# docker commit -m "my nginx" 694e6ee2153b joker/mynginx:v1 joker 在提交dockhub上需要有个用户名 mynginx 就是镜像名 v1 标签,版本 [root@Poppy ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE joker/mynginx v1 8f96c054de4f About a minute ago 396 MB [root@Poppy ~]# docker run -it --name nginxv1 joker/mynginx:v1 必须要加joker了,不然就是dockerhub.io去找了 v1如果不加默认就是找last # nginx让它前端运行,后端运行的话,退出就没了 [root@e0054021410d /]# vi /etc/nginx/nginx.conf [root@e0054021410d /]# cat -n /etc/nginx/nginx.conf|grep daemon 4 daemon off; [root@e0054021410d /]# exit [root@Poppy ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e0054021410d joker/mynginx:v1 "/bin/bash" 3 minutes ago Exited (0) 18 seconds ago # 重新提交 [root@Poppy ~]# docker commit -m "my nginx" e0054021410d joker/mynginx:v2 前台的 nginx [root@Poppy ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE joker/mynginx v2 0083e3e3eddb 24 seconds ago 396 MB # 启动前台的nginx [root@Poppy ~]# docker run -d -p 82:80 joker/mynginx:v2 nginx 最后的nginx就是命令,也就是代表启动nginx,如果是编译的话就需要决定路径 之前我们没有写,默认是/bash,必须要有个命令 [root@Poppy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f337c774ebf4 joker/mynginx:v2 "nginx" 13 seconds ago Up 12 seconds 0.0.0.0:82->80/tcp confident_golick # 访问测试 [root@joker ~]# curl docker_nginx_ip:82 <h1>Welcome to <strong>nginx</strong> on Fedora!</h1>
dockerfile 构建容器
docker build /opt/nginx/Dockerfile
1. 基础镜像
2. 维护者信息
3. 镜像操作指令
4. 容器启动时执行指令
# 目录结构 [root@Poppy nginx]# pwd /opt/dockerfile/nginx [root@Poppy nginx]# ll total 8 -rw-r--r-- 1 root root 352 Jul 4 17:09 Dockerfile -rw-r--r-- 1 root root 16 Jul 4 17:09 index.html # Dockerfile 文件写法 [root@Poppy nginx]# cat Dockerfile # This docker file # VERSION 1 # Author: joker # Base images FROM centos # Maintainer MAINTAINER joker.li xxx@qq.com # Commands RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum install -y nginx ADD index.html /usr/share/nginx/html/index.html RUN echo "daemon off;" >> /etc/nginx/nginx.conf 前台执行 EXPOSE 80 爆漏的端口 CMD["nginx"] 启动的应用 [root@Poppy nginx]# cat index.html <h1>hello!</h1> # 开始构建 [root@Poppy nginx]# docker build -t joker/mynginx:v3 . .表示当前目录,注意add添加文件的路径,也可以写绝对路径,建议去dockerfile的目录 如果build失败,重新build,会保留之前错误前的位置,就是保留状态,是按照层一步一步往下执行的,没过一层都会有提示 Step 5/8 : ADD index.html /usr/share/nginx/html/index.html ---> c1b716296ec8 Removing intermediate container 2ec5ecda9930 Step 6/8 : RUN echo "daemon off;" >> /etc/nginx/nginx.conf ---> Running in 36512ef47738 # 查看镜像 [root@Poppy nginx]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE joker/mynginx v3 1d8814de556c About a minute ago 417 MB # 指定端口映射启动容器 [root@Poppy nginx]# docker run -d -p 83:80 joker/mynginx:v3 # 参数解释 ADD 添加文件 EXPOSE 80 开放的端口 CMD["nginx"] 容器启动以后,默认的执行的命令,如果是编译就写入绝对路径 CMD指令可以指定容器启动时要执行的命令,但它可以被docker run命令的参数覆盖掉。 ENTRYPOINT 指令和CMD类似,它也可用户指定容器启动时要执行的命令,但如果dockerfile中也有CMD指令,CMD中的参数会被附加到ENTRYPOINT 指令的后面。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。 这样当容器启动后,会执行ENTRYPOINT 指令的参数部分。 可以看出,相对来说ENTRYPOINT指令优先级更高。 可以参考 https://www.cnblogs.com/wq3435/p/6487185.html 这个人的解释
构建好了容器,如何放在私有仓库里面呢?其他主机可直接pull镜像就可以了
构建私有仓库
# 之前是拷贝出来 dockerhub -- github docker regisry / gitlab 开源仓库 [root@Poppy ~]# docker images docker.io/registry latest d1fd7d86a825 5 months ago 33.3 MB # 仓库端口5000 [root@Poppy ~]# docker run -d -p 5000:5000 registry # 测试能否使用 仓库是v1版本的时候 [root@Poppy ~]# curl docker_server_ip:5000/v1/search 仓库是v2版本的时候 [root@Poppy ~]# curl docker_server_ip:5000/v2/_catalog {"repositories":[]} # 打一个标签将镜像打到仓库里 [root@Poppy ~]# docker tag joker/mynginx:v3 docker_server_ip:5000/joker/mynginx:latest [root@Poppy ~]# docker push docker_server_ip:5000/joker/mynginx:latest The push refers to a repository [docker_server_ip:5000/joker/mynginx] Get https://docker_server_ip:5000/v1/_ping: http: server gave HTTP response to HTTPS client # 不让push,需要https 配置nginx 用户认证 https [root@Poppy ~]# yum install -y nginx [root@Poppy ssl]# cat /etc/nginx/conf.d/docker-registry.conf upstream docker-registry { server 127.0.0.1:5000; } server { listen 443; server_name registry.joker.com; ssl on; ssl_certificate /etc/ssl/nginx.crt; ssl_certificate_key /etc/ssl/nginx.key; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 0; chunked_transfer_encoding on; location / { auth_basic "Docker"; auth_basic_user_file /etc/nginx/conf.d/docker-registry.htpasswd; proxy_pass http://docker-registry; } location /_ping { auth_basic off; proxy_pass http://docker-registry; } location /v1/_ping { auth_basic off; proxy_pass http://docker-registry; } } # 创建证书 [root@Poppy CA]# pwd /etc/pki/CA [root@Poppy CA]# touch ./{serial,index.txt} [root@Poppy CA]# echo "00" > serial [root@Poppy CA]# openssl genrsa -out private/cakey.pem 2048 Generating RSA private key, 2048 bit long modulus ..................................................+++ ..................................................................+++ e is 65537 (0x10001) # 签发根证书 [root@Poppy CA]# openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Beijing Locality Name (eg, city) [Default City]:Beijing Organization Name (eg, company) [Default Company Ltd]:joker Organizational Unit Name (eg, section) []:docker Common Name (eg, your name or your server's hostname) []:registry.joker.com Email Address []:joker@qq.com # 创建nginx证书 [root@Poppy ssl]# pwd /etc/ssl [root@Poppy ssl]# openssl genrsa -out nginx.key 2048 [root@Poppy ssl]# openssl req -new -key nginx.key -out nginx.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:Beijing Locality Name (eg, city) [Default City]:Beijing Organization Name (eg, company) [Default Company Ltd]:joker Organizational Unit Name (eg, section) []:docker Common Name (eg, your name or your server's hostname) []:registry.joker.com Email Address []:joker@qq.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: # 签发nginx证书 [root@Poppy ssl]# openssl ca -in nginx.csr -days 3650 -out nginx.crt # 让系统接收一下咱们自己签发的证书 [root@Poppy ssl]# cat /etc/pki/CA/cacert.pem >> /etc/pki/tls/certs/ca-bundle.crt # nginx访问用户密码 [root@Poppy ssl]# htpasswd -cb /etc/nginx/conf.d/docker-registry.htpasswd joker 123456 Adding password for user joker # 看能否认证通过 [root@Poppy ssl]# docker login -u joker -p 12345 -e joker@qq.com registry.joker.com # 如果出现问题 [root@Poppy ssl]# docker push docker_server_ip:5000/joker/mynginx:latest The push refers to a repository [docker_server_ip:5000/joker/mynginx] [root@Poppy ssl]# cat /etc/sysconfig/docker # /etc/sysconfig/docker # Modify these options if you want to change the way the docker daemon runs OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry docker_server_ip:5000' 加入了 --insecure-registry docker_server_ip:5000 来解决证书问题 这样就把咱们的手动创建的容器放在了私有仓库里,其他客户端在用的时候直接pull下来就可以了
最后我们就来执行?其实docker是给每个容器分出来命名空间来实现资源分离?kernel namespace
pid net ipc mnt uts user 消息 文件系统 pid 不同的用户进程使用pid的namespace进行隔离,不同的namespace就可以有相同的pid net 网络隔离,网桥,我们在启动时候不是有个网卡docker0 通过docker ps 可以看到如下,每个docker都有一个这样的 veth15b5d77: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 4a:f6:e1:10:38:5c txqueuelen 0 (Ethernet) RX packets 4718 bytes 341363 (333.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4716 bytes 10770863 (10.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ipc 进程间的交互方法 mnt 挂载 uts 独立的主机名和域名,用户态 user uid,gid 在启动容器的时候,也是可以指定资源的 -c 权重 -m 内存
最后的最后,管理docker有个可视化工具
shipyard 可以页面化管理docker,那你需要让docker监听一个tcp地址 监听tcp端口 [root@Poppy ~]# cat /etc/sysconfig/docker # /etc/sysconfig/docker # Modify these options if you want to change the way the docker daemon runs OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry docker_server_ip:5000 -H tcp://0.0.0.0:235 -H unix://var/run/docker.sock' -H 指定tcp [root@Poppy ssl]# systemctl restart docker 测试 [root@Poppy ~]# curl -s http://docker_server_ip:235/info | python -mjson.tool 之后我们就可以将shipyard下载下载安装使用 http://shipyard-project.com/
更多