docker_基础
来源:互联网 发布:c语言easyx 编辑:程序博客网 时间:2024/05/22 03:34
docker学习笔记
docker是一个开源的引擎,可以为任何的应用创建一个轻量级的,可移植的,自给自足的容器。
特点:
隔离性:使用沙盒技术,每个用户实例之间互相隔离,互不影响。
可度量/可配额:每个用户实例可以按需提供计算资源,所使用的资源可以被计量
移动性:用户可以很方便的复制,移动和重建
安全性:
docker的三个基本概念
镜像(image)
docker镜像是一个只读的模板,可以用来u创建Docker容器。
容器(container))
docker利用容器来运行应用。容器是从镜像中创建的实例,它可以被启动,开始,停止,删除。每个
容器相互隔离,保证安全的平台。可以把容器和镜像的关系比作对象和类的关系。
镜像是只读的,容器是在启动的时候创建一层可以读写的层作为最上层。
仓库(Repository)
仓库是用来存放镜像的地方,可分为可分为公有仓库和私有仓库。
理解这三个概念有助于理解docker的整个的生命周期
实验系统环境:rehel7.2
实验环境:selinux和iptables是disabled
所需rpm包
docker-engine-1.10.3-1.el7.centos.x86_64.rpm
docker-engine-selinux-1.10.3-1.el7.centos.noarch.rpm
docker 容器的常用命令
systemctl start docker 开启docker服务
systemctl stop docker 关闭docker服务
docker info 查看程序是否正常工作
docker load -i ubuntu.tar 导入镜像
docker run -it –name vm1 ubuntu
docker run 命令用来创建容器 -i 是指交互式 -t是tty终端 -d可以打入后台
容器的名字是vm1 ,所使用的镜像是ubuntu
docker attach vm1 连接容器
docker top vm1 查看容器进程
docker ps -a 查看已经创建的容器
docker inspect vm1 查看容器详情
docker stats vm1 查看容器资源使用率
docker diff vm1 查看容器修改
docker stop vm1 停止容器
docker start vm1 启动容器
docker attach vm1 连接容器
docker cp vm1:/test.py: /mnt 将容器内根下的test.py 拷贝的物理机下的mnt
docker exec vm1 ls / 查看容器根目录
docker restart vm1 重启容器
docker pause/unpause vm1 暂停/恢复容器
docker rm vm1 删除容器
docker commit vm1 ubuntu:test 将容器更新为镜像
docker export vm1 > vm1.tar 导出容器
docker import vm1.tar image 导入容器为镜像 image
景象的管理
镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是
增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。
docker search 查询镜像
docker pull 拉取镜像
docker push 推送镜像
docker save ubuntu > ubuntu.tar 导出镜像
docker load -i ubuntu.tar 导入镜像
docker commit 更新镜像
docker rmi 删除镜像
创建镜像:
1.利用现成的镜像进行修改
[root@localhost docker]# docker run -it --name vm1 rhel7 bash rhel7镜像没有yum源,没有vim,ping ip bash-4.2# cd /etc/yum.repos.d/ bash-4.2# vi yum.repo [rhel7.2] name=rhel7.2 baseurl=http://192.168.122.1/rhel7.2 gpgcheck=0 bash-4.2# yum clean all bash-4.2# yum repolist bash-4.2# yum install -y vim bash-4.2# yum install -y iproute ip命令 /usr/sbin/ip bash-4.2# yum install -y iputils ping 命令/usr/bin/ping bash-4.2# [root@localhost docker]# [root@localhost docker]# docker commit -m yum vm1 rhel7:v1 2.利用dokerfile创建
[root@localhost docker]# mkdir /mnt/docker/ [root@localhost docker]# vim Dockerfile [root@localhost docker]# cat Dockerfile FROM rhel7:v1 MAINTAINER wax ENV HOSTNAME server1 EXPOSE 80 RUN yum install -y httpd CMD ["/usr/sbin/httpd","-D","FOREGROUND"] [root@localhost docker]# docker build -t rhel7:v2 . .16cker history rhel7:v2 IMAGE CREATED CREATED BY SIZE COMMENT 9a4d7bee94ff 39 seconds ago /bin/sh -c #(nop) CMD ["/usr/sbin/httpd" "-D" 0 B e0948s ago bash 92.29 MB yum 0a3eb3fde7fd 3 years ago 140.2 MB Imported from - 测试: [root@localhost docker]# docker run -d --name apache -p 8080:80 rhel7:v2 [root@localhost docker]# vim index.html [root@localhost docker]# cat index.html <h1>docker1</h1> [root@localhost docker]# docker cp index.html apache:/var/www/html [root@localhost docker]# curl 172.25.12.250:8080 <h1>docker1</h1>
数据卷管理
docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v
的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共
享一个目录。冒号前面的是宿主机的目录(本地目录不存在docker会自动创建),冒号后面的是容器中的挂载目录
注意:docker commit 时卷中的数据不会被保存。
docker run -it –name vm2 -v /tmp/data2:/data2 ubuntu 读写挂载
docker run -it –name vm3 -v /tmp/data3:/data3:ro ubuntu 只读挂载
[root@localhost Desktop]# docker create --name datavol -v /tmp/data1:/data1 -v/tmp/data2:/data2:ro ubuntu24488c0977030252d49cf8cf117f8d77d39ae02d7ef86e04329417fbe237410a[root@localhost Desktop]# docker run -it --name vm1 --volumes-from datavol ubunturoot@5e7a8d3a59b2:/# lsbin data1 dev home lib64 mnt proc run srv tmp varboot data2 etc lib media opt root sbin sys usrroot@5e7a8d3a59b2:/# cd data1/root@5e7a8d3a59b2:/data1# cp /etc/passwd .root@5e7a8d3a59b2:/data1# lsadduser.conf host.conf login.defs os-release shellsroot@5e7a8d3a59b2:/data1# cd /data2root@5e7a8d3a59b2:/data2# cp /etc/passwd .cp: cannot create regular file './passwd': Read-only file systemroot@5e7a8d3a59b2:/data2# [root@localhost Desktop]#[root@localhost Desktop]# docker run --rm --volumes-from datavol -v/tmp/backup:/backup ubuntu tar cf /backup/etc.tar /data1tar: Removing leading `/' from member names[root@localhost Desktop]# cd /tmp/backup/[root@localhost backup]# lsdata1 etc.tar
网络管理
Docker 在启动时会创建一个虚拟网桥 docker0,默认地址为 172.17../16, 容器启动后都会
被桥接到 docker0 上,并自动分配到一个 IP 地址。
修改docker的默认网络配置
1.命令行修改
systemctl stop docker
ip link set dev docker0 down
ip addr del 172.17../24 dev docker0
ip addr add 192.168../24 dev dcoker0
ip link set dev docker0 up
2.文件修改:
cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
vim /etc/systemd/system/docker.service
[Service]Type=notifyExecStart=/usr/bin/docker daemon -H fd:// --bip="192.168.12.1/24"...
systemctl daemon-reload
systemctl start docker
容器的四种网络的模式:
bridge桥接模式、host模式、container模式和none模式
启动容器时可以使用 –net 指定参数,默认是桥接模式。
bridge桥接模式:
简单的说:Docker Daemon 利用veth pair技术可以在宿主机上创建两个虚拟的网络接口设备。
这两个设备是通的(相当于一根网线),无论那端收到网络报文,都会传输到另外的一端。
一端桥接到docker0上,另外一端接到Docker Container所属的namespace下。
这样宿主机和容器就可以通信了。
桥接的模式,容器相当于内网,不具有公有IP,外界不能直接和容器进行通信。可以使用NAT模式,经过中间实现,但会和宿主机竞争端口。NAT模式由于是在第三层网络上的实现手段,故影响网络的传输效率。
[root@localhost backup]# docker run -d --name web1 nginx170eed22fdce0968478f47be7936714b9409f539ea6b631f100db9d5340c2706[root@localhost backup]# docker inspect web1[root@localhost backup]# curl 192.168.12.2
[root@localhost backup]# docker run -d --name web2 -p 8000:80 nginx[root@localhost backup]# netstat -antlpe | grep :8000[root@localhost backup]# netstat -antlpe | grep :8000
Host网络模式:
host模式可以使用宿主机的IP地址与外界进行通信,也可以使用宿主机的端口进行通信。
简单的说容器和宿主机共同使用IP和端口。
host模式的网络隔离性弱化了,不在拥有隔离,独立的网络栈。
[root@localhost backup]# docker run -d --name web3 --net host nginx[root@localhost backup]# iptables -t nat -nL
Container网络模式:
container模式可以使容器间共享namespace,简单的说对于同一个服务可以共用一个IP和端口。
这样可以更好的使容器间进行通信。容器可以通过localhost来访问其他的容器,传输效率较高,
节省了网络资源。多个容器形成的整体与宿主机以及其他容器形成隔离。
但并没有改善容器与宿主机以外的通信情况。
[root@localhost backup]# docker run -it --name web4 --net container:web2 ubunturoot@0884821115e4:/# ip addr show eth014: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c0:a8:0c:03 brd ff:ff:ff:ff:ff:ff inet 192.168.12.3/24 scope global eth0 与web2的ip一致 valid_lft forever preferred_lft forever inet6 fe80::42:c0ff:fea8:c03/64 scope link valid_lft forever preferred_lft forever
[root@localhost ~]# docker -d --name web nginx[root@localhost ~]# docker run -d --name web nginx[root@localhost ~]# docker run -it --name vm1 --link web:niginx ubunturoot@1b75e8ac6097:/# envroot@1b75e8ac6097:/# ping webPING niginx (192.168.12.2) 56(84) bytes of data.64 bytes from niginx (192.168.12.2): icmp_seq=1 ttl=64 time=0.161 ms64 bytes from niginx (192.168.12.2): icmp_seq=2 ttl=64 time=0.083 msroot@1b75e8ac6097:/# cat /etc/hosts
None模式:
不为容器指定任何的网络环境。
[root@localhost backup]# docker run -it --net none --name vm1 ubuntu 创建一个网络模式为none的容器 root@ff15a70c198d:/# ip addr 该容器只有一个本地接口 root@ff15a70c198d:/# [root@localhost backup]# [root@localhost backup]# cd /var/run/ [root@localhost run]# ip netns add test 如果没有netns目录可以创建 [root@localhost run]# ip link add name veth0 type veth peer name veth1 相当于建立一根网线 [root@localhost run]# ip link set up veth1 [root@localhost run]# ip link set up veth0 [root@localhost run]# brctl addif docker0 veth0 [root@localhost run]# docker inspect vm1 | grep Pid 查看虚拟机的Pid "Pid": 9542, "PidMode": "", "PidsLimit": 0, [root@localhost ns]# ln -s /proc/9542/ns/net /var/run/netns/9542 [root@localhost netns]# ip link set veth1 netns 9542 [root@localhost netns]# ip netns exec 9542 ip link set veth1 name eth0 修改namespace的名字 [root@localhost netns]# ip netns exec 9542 ip link set eth0 up 在namespace中启用一个设备 [root@localhost netns]# ip netns exec 9542 ip addr add 192.168.12.100/24 dev eth0 为namespace中的设备指定ip [root@localhost netns]# ip netns exec 9542 route add default gw 192.168.12.1 为namespace中的设备指定网关 [root@localhost netns]# docker exec vm1 ping 172.25.12.250 PING 172.25.12.250 (172.25.12.250) 56(84) bytes of data. 64 bytes from 172.25.12.250: icmp_seq=1 ttl=64 time=0.072 ms 64 bytes from 172.25.12.250: icmp_seq=2 ttl=64 time=0.078 ms
- docker_基础
- Docker_入门?只要这篇就够了!(纯干货适合0基础小白)
- CSDN屏蔽测试:Docker_入门?只要这篇就够了!(纯干货适合0基础小白)
- docker_相关操作
- docker_自建私有仓库
- docker_在ubuntu上安装docker服务
- docker_提交、保存加载、导入导出
- docker_容器间的链接 link
- error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.28/version: open //./pipe/docker_
- error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.28/version: open //./pipe/docker_
- 基础
- 基础
- 基础
- 基础
- 基础
- 基础
- 基础
- 基础
- bonding mode 4 测试
- shiro登录认证以及未知错误:Authentication failed for token submission
- 初探PHP面向对象与设计模式-策略模式
- Android开发艺术探索_Activity的生命周期和启动模式(一)
- 状态的进行中、未开始、已结束状态的排序
- docker_基础
- C语言结构数组 动态录入游戏英雄信息并且计算平均生命值
- 获取Facebook直播地址
- Qt程序打包成exe可执行文件图文教程
- HDFS Permissions
- 线性代数6-二次型
- 福建计划投资逾万亿元实施“九大工程”
- 本土浏览器如何步步演绎对国外浏览器的逆袭?
- codeforces 839B(模拟)