自定义镜像
1>docker commit
思路: 使用镜像启动容器,在该容器基础上修改,将该配置好的容器通过docker commit命令创造出一个新的镜像
- [root@jacob ~]# docker run -itd centos /bin/bash------------使用镜像启动容器,
- 修改(增删改数据、安装软件、修改配置文件等)-------------在该容器基础上修改配置
- exit------退出容器
- docker ps -a-------列出所有虚拟机,需要用到刚创建的docker的ID
- [root@jacob ~]# docker commit IDs name:label
- docker commit 78c1f924c498 myos----------------将该配置好的容器通过docker commit命令创造出一个新的镜像
- docker images-------列出所有镜像
- docker run -it myos /bin/bash------以该新自定义配置的镜像新开容器(就相当于是一个新的模版)
2>Dockerfile
• Dockerfile语法格式
- – FROM:基础镜像(根据镜像) 从哪儿来?
- – MAINTAINER:镜像创建者信息
- – EXPOSE:开放的端口
- – ENV:设置变量
- – ADD:把本地文件放到容器里面去
- – RUN:制作镜像时执行的命令,可以有多个(run指在容器里面执行命令)
- – WORKDIR:定义容器默认工作目录
- – CMD:容器启动时执行的命令,仅可以有一条CMD
- Docker build -t 新的镜像名称:标签
• 使用Dockerfile工作流程
mkdir oo
cd oo
touch Dockerfile----------D一定要大写
[root@docker1 oo]# vim Dockerfile
FROM centos:latest
RUN rm -f /etc/yum.repos.d/*.repo
ADD centos7.repo /etc/yum.repos.d/r.repo
RUN yum install -y net-tools psmisc vim-enhanced
[root@docker1 oo]# docker build -t ypf:latest .------------- 也可以写成 docker build -t ypf:latest /root/oo
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM centos:latest
---> e934aafc2206
Step 2 : RUN rm -f /etc/yum.repo.d/*.repo
---> Running in 1cbddd279e7f
---> 07a3a0fdc01f
Removing intermediate container 1cbddd279e7f
Step 3 : ADD centos7.repo /etc/yum.repo.d/r.repo
---> 5d15615200e7
Removing intermediate container e4d78f9bf9a2
Step 4 : RUN yum install -y net-tools psmisc vim-enhanced
---> Running in bf5b48a44660
[root@docker1 oo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ypf latest 7c9318505333 About a minute ago 346.2 MB
[root@docker1 oo]# docker run -it ypf
[root@32ac56bcbb88 /]# ifconfig-------------可以看到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
inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link>
• Dockerfile文件案例
[root@jacob build]# cat Dockerfile
FROM centos
MAINTAINER Jacob redhat@163.com
ENV NAME=Jacob
ENV environment=test
WORKDIR /var/www/html
ADD test.sh /root/test.sh
RUN mkdir /dockerfile
RUN echo "test" > /dockerfile/file.txt
RUN yum -y install httpd
RUN echo "test" > /var/www/html/index.html
EXPORSE 80
CMD [“httpd", "-DFOREGROUND"]
案例1:制作自定义镜像pstree -p
制作自定义镜像
– 基于centos镜像使用commit创建新的镜像文件
– 基于centos镜像使用Dockerfile文件创建新的镜像文件
自定义镜像仓库
registry基本概念
• 共享镜像的一台服务器(镜像化的一台服务器)
pstree -p
– 基于centos镜像使用commit创建新的镜像文件
– 基于centos镜像使用Dockerfile文件创建新的镜像文件
自定义私有仓库
• 流程:
在自定义镜像仓库的服务器(192.168.1.101)上
配置文件 /etc/docker/daemon.json
{
"insecure-registries" : ["192.168.1.11:5000"]
}
完成配置以后重启 docker 服务
systemctl restart docker
启动私有仓库服务
docker run -d -p 5000:5000 registry
– docker tag 镜像 IP:5000/镜像:label
docker tag myos:latest 192.168.1.11:5000/myos:latest
– docker push IP:5000/镜像:label
docker push 192.168.1.11:5000/myos:latest
客户机使用私有镜像源
配置 daemon.json
重启服务 systemctl restart docker
启动容器
[root@docker2 ~]# docker run -it 192.168.1.101:5000/myos
Unable to find image '192.168.1.101:5000/myos:latest' locally
latest: Pulling from myos
9770d73ca513: Pull complete
ae4218ccc270: Pull complete
Digest: sha256:4f100a30c95d307b94fd9a7109cd40ae633831bc718a642d7eff6ae2af2e8a07
Status: Downloaded newer image for 192.168.1.101:5000/myos:latest
[root@docker2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.101:5000/myos latest 8541104a5ae5 5 hours ago 314 MB
[root@docker2 ~]# docker pull 192.168.1.101:5000/centos
Using default tag: latest
latest: Pulling from centos
9770d73ca513: Already exists
Digest: sha256:aac8a9e78aaaea4b7a29125007d8dc1b0a5787e0a4ab39ff69c98141ae07f1da
Status: Downloaded newer image for 192.168.1.101:5000/centos:latest
[root@docker2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.101:5000/myos latest 8541104a5ae5 5 hours ago 314 MB
192.168.1.101:5000/centos latest e934aafc2206 4 months ago 198.6 MB
[root@docker2 ~]# docker run -it 192.168.1.101:5000/centos
在自定义镜像仓库的服务器(192.168.1.101)上:
yum -y install httpd
systemctl start httpd
[root@docker2 ~]# curl http://192.168.1.101:5000/v2/_catalog--------查看容器中有哪些镜像
{"repositories":["centos","myos"]}
查看私有仓库有什么样的镜像
curl http://192.168.1.11:5000/v2/_catalog
查看私有仓库的镜像有什么样的标签
curl http://192.168.1.11:5000/v2/myos/tags/list
持久化存储
存储卷
卷的概念
• docker容器不保持任何数据
• 重要数据请使用外部卷存储(数据持久化)
• 容器可以挂载真实机目录或共享存储为卷
主机卷的映射
• 将真实机目录挂载到容器中提供持久化存储
存储卷映射
docker run -itd -v 物理机文件夹:容器内文件夹 镜像:标签
[root@jacob ~]# docker run -v /data:/data -it centos bash
共享存储
共享存储基本概念
• 一台共享存储服务器可以提供给所有Docker主机使用
• 共享存储服务器(NAS、SAN、DAS等)
• 如:
– 使用NFS创建共享存储服务器
– 客户端挂载NFS共享,并最终映射到容器中
使用共享存储的案例
- NFS共享服务器
- – yum -y install nfs-utils
- – vim /etc/exports
- /22 *(rw,no_root_squash)
- echo ewirtoier > /22/index.html
- – systemctl start nfs
- docker1
-
[root@docker1 docker]# showmount -e 192.168.1.254
Export list for 192.168.1.254:
/22 * -
mount -t nfs 192.168.1.254:/22 /999------------– mount挂载共享
docker run -v /999:/var/www/html -it centos-------- 运行容器时,使用-v选项映射磁盘到容器中,将物理机上的/999 映射到容器里的/var/www/html
Docker网络架构
Linux网桥
创建虚拟网卡
• 真实网卡配置文件
– cat /etc/sysconfig/network-scripts/ifcfg-eth0
• 虚拟网卡配置文件
– cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=static
... ...
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.4.15
创建虚拟网桥(虚拟交换机)
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
... ...
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.4.15
[root@jacob ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
... ...
NAME=eth0
DEVICE=eth0
BRIDGE=br0
ONBOOT=yes
IPADDR=192.168.4.15
[root@jacob ~]# ~]# brctl show
Docker网络拓扑
查看Docker默认网络模型
[root@jacob ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
c0ae28d57b18 bridge bridge local 桥接模型
b69d4c0c735f host host local 主机模型
4dc88be13b81 none null local 无网络
[root@jacob ~]# ip a s docker0
[root@jacob ~]# brctl show docker0 //启动容器会绑定该网桥
使用Docker创建网桥
新建Docker创建网桥
[root@jacob~]# docker network create --driver bridge test01
[root@jacob~]# docker network list
[root@jacob~]# ip a s
[root@jacob~]# docker network inspect test01
• 查看默认Docker创建的网络模型
– 自定义网段
[root@jacob ~]# docker network create --subnet=172.30.0.0/16 test01
使用自定义网桥
• 启动容器,使用刚刚创建的自定义网桥
[root@jacob ~]# docker run --network=bridge|host|none ... ...
[root@jacob ~]# docker run --network=test01 -id nginx
客户端访问容器内的资源
• 默认容器通过SNAT可以访问外网
• 但外部网络的主机不可以访问容器内的资源
• 端口映射
– 使用端口映射可以实现外部网络访问容器内的资源
[root@jacob ~]# docker run -p 8080 80 -id nginx
创建容器,使用宿主机的端口 -p 宿主机端口:容器端口
docker run -d -p 80:80 -v /var/webroot:/var/www/html 192.168.1.11:5000/myos:httpd------既端口多路复用,又进行存储卷影射
//如:真实机IP为192.168.4.5,
使用-p映射真实机的8080端口到容器中的80端口
[root@client ~]# firefox http://192.168.4.5
手动笔记:
学了docker应用场景是什么样的?
Web应用的自动化打包和发布
自动化测试和持续集成、发布
在服务型环境中部署和调整数据库或其他的后台应用
从头编译或者扩展现有的OpenShift(红帽的平台即服务)或cloud foundry(vmware推出的业界第一个开源云平台)平台来应用
Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器
Docker容器通过docker镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类型。
Docker镜像() 镜像是用于创建Docker容器的模板
Docker容器() 容器是独立运行的一个或一组应用
Docker客户端() Docker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信
Docker主机() 一个物理或者虚拟机的机器用于执行Docker守护进程和容器
Docker仓库() Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。
Docker Hub提供了庞大的镜像集合供使用
Docker Machine 是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker。
自定义镜像:
1.启动一个centos容器
2.进入容器(配置成需要的系统)
配置yum源
安装常用工具软件
3.配置完成以后,停止容器,创建镜像
Docker commit 容器ID 镜像名称:标签
创建一次 手工创建没有什么问题
写成脚本可以自动创建
- 使用Dockerfile(创建个文件夹-》创建个Dockerfile文件(名字随意)-》运行后修改配置且创建成功)
Dockerfile 文件名
FROM 基础镜像
ADD 添加文件
RUN 在容器内运行命令
CMD 修改默认启动命令
docker build -t 新的镜像名称:标签 .
– FROM:基础镜像(根据镜像创建命令) 从那儿来
– MAINTAINER:镜像创建者信息 谁做的
– EXPOSE:开放的端口 把多少物理机端口打开
– ENV:设置变量
– ADD:复制文件到镜像 把test.sh复制到镜像
– RUN:制作镜像时执行的命令,可以有多个(容器里执行后面的命令) 镜像执行命令
– WORKDIR:定义容器默认工作目录 在那里做事
– CMD:容器启动时执行的命令,仅可以有一条CMD 容器从那里启动
怎么启动两个服务?
pstree -p
出现问题:1.权限问题有没有给755 2.
自定义仓库:
docker run -d -p 5000:5000 registry //建立私有仓库,默认使用HTTPS。改成http
Vim /etc/docker/daemon.json
怎么看企业有什么镜像仓库?
通过dockerAPI查询
[root@localhost ~]# curl -i http://192.168.1.100:5000/v2/_catalog
[root@localhost ~]# curl -i http://192.168.1.100:5000/v2/busybox/tags/list
1.创建配置文件
vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.100:5000"]
}
2.重启docker服务
systemctl restart docker.service
3.启动私有仓库
docker run -d -p 5000:5000 registry
4.上传镜像到私有仓库(给镜像打标签后上传)
docker tag busybox:latest 192.168.1.100:5000/busybox:latest
docker push 192.168.1.100:5000/busybox:latest
5.在另一台docker上测试
scp 192.168.1.100:/etc/docker/daemon.json /etc/docker/
systemctl restart docker.service
docker run -it 192.168.1.100:5000/busybox:latest
持久化存储
主机卷映射:
docker run -d -p 80:80 -v /var/webroot:/var/www/html 192.168.1.100:5000/myos:httpd
docker run -d -p 80:80 -v /var/webroot:/var/www/html 192.168.1.100:5000/myos:httpd
共享存储映射:
Server:
yum -y install nfs-utils
mkdir 创建适合的文件夹路径 比如:/nfsnaszhen
echo "115599" > /nfsnaszhen/test.txt
vim /etc/exports
/nfsnaszhen 192.168.1.100(rw)
systemctl start nfs
chmod 777 /nfsnas
Client:
mkdir 创建适合的文件夹路径
mount 192.168.1.254:/nfsnaszhen/ /nfsnas/
docker run -it --network docker1 192.168.1.100:5000/centos
Virsh manager
Openstack 开源云计算管理平台
Docker在一两台机器上
100台怎么办?
Kubernetes集群(k8s)
Docker命令大全:
[root@localhost ~]# docker -v
Docker version 1.12.1, build 23cf638
[root@localhost ~]# docker --help
Usage: docker [OPTIONS] COMMAND [arg...]
docker [ --help | -v | --version ]
A self-sufficient runtime for containers.
Options:
--config=~/.docker Location of client config files
-D, --debug Enable debug mode
-H, --host=[] Daemon socket(s) to connect to
-h, --help Print usage
-l, --log-level=info Set the logging level
--tls Use TLS; implied by --tlsverify
--tlscacert=~/.docker/ca.pem Trust certs signed only by this CA
--tlscert=~/.docker/cert.pem Path to TLS certificate file
--tlskey=~/.docker/key.pem Path to TLS key file
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Commands:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on a container, image or task
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry.
logout Log out from a Docker registry.
logs Fetch the logs of a container
network Manage Docker networks
node Manage Docker Swarm nodes
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart a container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
service Manage Docker services
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
swarm Manage Docker Swarm
tag Tag an image into a repository
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
volume Manage Docker volumes
wait Block until a container stops, then print its exit code
Run 'docker COMMAND --help' for more information on a command.