学习笔记--Docker

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记--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  后台运行端口为8080nginx

 

 

 

对镜像的操作

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

获取vm1Pid

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是否添加成功

veth1vm1相连

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客户端并连接至别名为dbredis

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  限制内存使用为200M200*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的文件  

[[email protected] shm]# free -m

             total       used       free     shared    buffers     cached

Mem:           996        223        772          0         15        141

-/+ buffers/cache:         67        929

Swap:          815          0        815

 

[[email protected] shm]#  cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300

Killed

[[email protected] 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

[[email protected] ~]$ ./memapp1

 

Process ID is: 6887

 

Grabbing 4096 pages of memory

 

Success!

 

[[email protected] ~]$ ./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/s80为设备idll /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   冻住进程,测试的为toppid

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的主要内容,如果未能解决你的问题,请参考以下文章

docker学习笔记——创建私有库

Docker学习笔记-持续更新中

docker~学习笔记索引

Docker学习笔记 — 开启Docker远程访问

docker学习笔记- 仓库

Docker 学习笔记 Docker 仓库数据卷数据卷容器,网络基础实操。高级网络配置学习