首页 > 代码库 > 学习笔记--Docker
学习笔记--Docker
环境:redhat7.2
安装包:
docker-engine-selinux-1.10.3-1.el7.centos.noarch
docker-engine-1.10.3-1.el7.centos.x86_64
开启服务:docker
docker version 查看docker版本
docker load -i rhel7.tar 倒入镜像
ctrl + p q 不中断退出
ctrl+d 退出并中断
docker ps -a 列出所有容器
docker run -it --name vm1 ubuntu bash打开交互式
docker stop vm1 docker start vm1 docker rm vm1
docker start/stop/kill/restart containername/id
非交互式在容器中运行命令:
# docker run --rm rhel7 cat /etc/hosts
列出当前正在运行的容器: # docker ps
列出最近一次启动的容器:# docker ps -l
重启停止的容器:
# docker start -ai vm1
Docker start `docker ps -aq` 打开所有容器
docker attach vm1 连接到vm1
docker top vm1查看容器详细参数
docker logs vm1查看对容器的所有操作 logs后加 -f 代表实时监控
docker stats vm1 查看运行状态
docker diff vm1查看对vm1的更改
docker inspect vm1 查看该容器所有信息
docker run -d --name vm1 ubuntu bash -c "while true;do echo wesots;sleept 1;done"打入后台并执行
docker pause/unpause vm1 停止/启动容器
docker run -d --name vm1 -p 8080:80 nginx 后台运行端口为8080的nginx
对镜像的操作
docker search/pull/push/rmi/save
docker save ubuntu > test.tar 镜像的导出
docker commit vm1 test 保存后提交生成test镜像
docker run -it --name vm4 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro rhel7 bash
容器内挂载物理机上的数据(默认权限为读写,data2赋予权限ro)
docker run -it --name vm1 -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash 将系统镜像挂载到容器内
docker create --name data -v /tmp/data1:/data1 -v /tmp/data2:/data2 rhel7 bash生成data卷,便于以后使用
docker run --rm --volumes-from data -v /tmp/backup:/backup ubuntu tar cf /backup/test.tar /data2 调用卷组中的data2,并将其中数据打包备份到backup目录下
修改docker网络
systemctl stop docker
ip addr del 172.17.0.1/16 dev docker0
ip addr add 172.17.60.1/24 dev docker0
ip link set dev docker0 up
cp /usr/lib/systemd/system/docker.service /etc/systemd/system/ (会先读取etc下的配置文件,若此处不存在,则会读取usr下的配置文件,**官方推荐:cp /usr/lib/systemd/system/docker.service /etc/systemd/system/)
vim /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl start docker
网络启动的四种方式:
1.不添加参数表示默认模式,桥接在docker0上
2.docker run -it --net=host --name vm2 ubuntu bash (此种模式会造成端口争抢)
3.docker run -it --name vm3 --net=container:vm1 ubuntu bash
4.docker run -it --name vm4 --net=none ubuntu bash
为第四种方式添加ip地址:
sysctl -a | grep ip_forward 查看是否开启,1为开启
启动一个none
docker run -it --name vm1 --net none ubuntu bash
添加连接口
ip link add name veth0 type veth peer name veth1
将接口一端连接至docker0,并激活veth0 1 状态为up
brctl addif docker0 veth0
ip link set dev veth0 up
ip link set dev veth1 up
获取vm1的Pid号
docker inspect -f ‘{{.State.Pid}}‘ vm1
通过获取的进程pid进入目录
cd /proc/9123/ns/
创建链接目录
mkdir -p /var/run/netns/
ln -s /proc/9123/ns/net /var/run/netns/9123
ip netns list查看9123是否添加成功
将veth1与vm1相连
ip link set veth1 netns 9123
给veth1一个ip地址
ip netns exec 9123 ip addr add 172.17.60.100/24 dev veth1
ip netns exec 9123 ip route add default via 172.17.60.1
加入docker0为网关,ping其他物理主机能否ping通
(重命名:ip netns exec 9123 ip link set veth1 name eth0
ip netns exec 9123 ip link set eth0 up )
容器间的互连:
打开一个redis并打入后台
docker run -d --name redis redis
打开一个redis客户端并连接至别名为db的redis
docker run -it --name redisclient --link redis:db redis bash
redis-cli -h db
config get *
在redhat6上
yum install libcgroup.x86_64 -y
/etc/init.d/cgconfig start
vim /etc/cgconfig.conf
添加:
group x1 {
memory {
##1 memory.limit_in_bytes=209715200;
##2 memory.memsw.limit_in_bytes=209715200;
}
}
##1 限制内存使用为200M(200*1024*1024),若只添加这一行,当超出200M时,多出的内存使用会到swap中
##2 限制swap与内存总和为200M
进入到内存中 /dev/shm
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300
调用x1 并写入一个300M的文件
[root@server9 shm]# free -m
total used free shared buffers cached
Mem: 996 223 772 0 15 141
-/+ buffers/cache: 67 929
Swap: 815 0 815
[root@server9 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300
Killed
[root@server9 shm]# free -m
total used free shared buffers cached
Mem: 996 422 573 0 15 339
-/+ buffers/cache: 67 929
Swap: 815 0 815
测试:利用memapp(一个page4kb)将限制控制在4096-8192之间
vim /etc/cgconfig.conf
group x1 {
memory {
memory.limit_in_bytes=18099999;
memory.memsw.limit_in_bytes=18099999;
}
}
退出该目录并/etc/init.d/cgconfig restart
vim /etc/cgrules.conf
yml:memapp1 memory x1/
yml:memapp2 memory x1/
为用户添加调用策略
/etc/init.d/cgred restart
切换到普通用户执行./memapp1 ./memapp2
[yml@server9 ~]$ ./memapp1
Process ID is: 6887
Grabbing 4096 pages of memory
Success!
[yml@server9 ~]$ ./memapp2
Process ID is: 6888
Grabbing 8192 pages of memory
Killed
控制cpu优先级
vim /etc/cgconfig.conf
group x2 {
cpu {
cpu.shares=100;
}
}
/etc/init.d/cgconfig restart
为了测试只让一个cpu工作:
cd /sys/devices/system/cpu/cpu1
echo 0 > online
开启两个占用cpu的进程,一个使用x2策略,另一个不使用
dd if=/dev/zero of=/dev/null &
cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6971 root 20 0 102m 696 576 R 90.9 0.1 0:27.39 dd
6972 root 20 0 102m 696 576 R 9.0 0.1 0:01.36 dd
-f -r
chrt -r 1 md5sum /dev/zero :轮叫
chrt -f 1 md5sum /dev/zero :抢夺
设置优先级:
renice -n 19 -p 7841(将7841进程优先级改为19)
限制io
yum install iotop
vim /etc/cgconfig.conf
group x3 {
blkio {
blkio.throttle.read_bps_device="8:0 1024000";##限制读取速度为1000k/s,8:0为设备id,ll /dev/sda查看
}
}
/etc/init.d/cgconfig restart
cgexec -g blkio:x3 dd if=/dev/sda of=/dev/null &
利用iotop工具查看io状况
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
7012 be/4 root 890.19 K/s 0.00 B/s 0.00 % 99.22 % dd if=/dev~f=/dev/null
冻住进程:
group x4 {
freezer {
}
}
cd /cgroup/freezer/x4
echo 7064 > tasks
echo FROZEN > freezer.state 冻住进程,测试的为top的pid
echo THAWED > freezer.state 解锁进程
安全
设置特权级运行的容器:--privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载
USB 磁盘,修改 MAC 地址等
docker run -it --name vm2 --privileged=true ubuntu bash
设置容器白名单:--cap-add
--privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限
制,只提供给容器必须的权限。此时 Docker 提供了权限白名单的机制,使用--cap-add 添加
必要的权限。
docker run -it --name vm3 --cap-add NET_ADMIN ubuntu bash
mkdir /mnt/test
cd /mnt/test vim Dockerfile
FROM rhel7:yum ####修改后commit
MAINTAINER yml
ENV HOSTNAME server1
EXPOSE 80
RUN yum install -y httpd && yum clean all
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
docker run -it --name vm1 -v /etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/dvd.repo rhel7:yum bash
docker build -t rhel7:apache .
docker run -d --name apache -p 8000:80 -v /mnt/test/index.html:/var/www/html/index.html rhel7:apache
curl 172.25.60.250:8000
FROM jingxiang
MAINTAINER yml
ENV HOSTNAME server2
EXPOSE 22
RUN echo root:wesots | chpasswd
RUN yum install -y openssh-server && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N ""
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ecdsa_key -q -N ""
CMD ["/usr/sbin/sshd","-D"]
运行多个应用
vim Dockerfile
FROM jx
MAINTAINER yml
ENV HOSTNAME server3
EXPOSE 22 80
RUN echo root:wesots | chpasswd
RUN yum install -y openssh-server httpd supervisor && yum clean all ###supervisor安装包须自己下载
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N ""
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_ecdsa_key -q -N ""
ADD index.html /var/www/html/index.html
COPY supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/superbisord"]
vim supervisord.conf
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:httpd]
command=/usr/sbin/httpd -D FOREGROUND
制作本地镜像仓库
vim /etc/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/docker daemon -H fd:// --bip 172.17.60.1/24 --insecure-registry 172.25.254.60:5000
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
systemctl daemon-reload
systemctl restart docker
docker load -i registry-2.3.1.tar
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2.3.1
docker tag redis 172.25.254.60:5000/redis:v1
docker push 172.25.254.60:5000/redis 上传
docker pull 172.25.254.60:5000/redis:v1 下载
加密
docker run --entrypoint htpasswd registry:2.3.1 -Bbn yml westos > /opt/auth/htpasswd
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry -v /opt/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry:2.3.1
docker login 172.25.254.60:5000只有在登陆后才能完成push pull动作
/root/.docker/config.json 证书文件所在位置,删除后须重新认证
学习笔记--Docker