docker 学习笔记

1 交互式登陆:

systemctl start docker.service
docker ps -a
docker rm -f `docker ps -aq`
docker ps -a
docker run -d --name vm1 nginx
3f3ad0e94c46357dff1bcd08c64f0d0a5c97638345e7e609f341a3708342d35a
docker container attach vm1
#该命令会打断nginx服务,nginx后面有cmd命令我们发现是无法进入vm1内部的 

docker 学习笔记_第1张图片

docker ps 
docker start vm1
docker ps
docker run -it --name vm2 nginx bash #run=create+start;交互式建立一个vm2 nginx镜像bash会覆盖nginx之后的CMD
root@4f48db4019b7:/# 

docker 学习笔记_第2张图片

docker container attach vm2
root@4f48db4019b7:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@4f48db4019b7:/# [root@foundation30 ~]# 
docker container exec -it vm1 bash
root@3f3ad0e94c46:/# hostname
3f3ad0e94c46
root@3f3ad0e94c46:/# 

镜像分层——->共享;

2. 开启多个服务在一个镜像中:

Dockerfile 负责安装;supervisor负责开启多个服务

因为cmd命令只能有一条所以想要同时开启多个服务定制到镜像中就需要调用一个管理进程来管理这些并行进程的运行启动。

supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。

cd /tmp/docker/
vim Dockerfile 

FROM rhel7
EXPOSE 80:22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN  rpmdb --rebuilddb && yum install -y httpd openssh-server openssh-client supervisor && yum clean all && ssh-keygen -q -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" &&  ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && ssh-keygen -q -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" &&  echo root:westos | chpasswd
COPY supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord"
vim supervisord.conf

[supervisord]
nodaemon=true

[program:sshd] #运行sshd
command=/usr/sbin/sshd -D

[program:httpd] #运行apche
command=/usr/sbin/httpd

vim dvd.repo

[dvd]
name=rhel7.3
baseurl=http://172.25.30.250/rhel7.3
gpgcheck=0

[docker]
name=docker
baseurl=http://172.25.254.250/pub/docker
gpgcheck=0

docker build  -t rhel7:v3 . #构建镜像v3
docker run -d --name vm1 -v /tmp/docker/web/:/var/www/html rhel7:v3 #挂载网页
docker inspect vm1 
curl 172.17.0.2 #测试httpd;80端口

docker 学习笔记_第3张图片
docker run -it –name vm1 -v /tmp/docker/web/:/var/www/html rhel7:v3 bash #交互式登陆vm1
测试22端口:
docker 学习笔记_第4张图片
docker 学习笔记_第5张图片

3. run cmd entrypoint三者的区别

run 装包,运行;镜像之后跟命令会覆盖cmd
cmd 容器启动可以被覆盖 ;只能用一次
entrypoint 可以用cmd传参;可以调用shell,不能被覆盖

测试三者区别:

mkdir test
vim Dockerfile
docker build  -t rhel7:v4 . #构建镜像
docker run  --rm rhel7:v4 #运行

docker 学习笔记_第6张图片
entrypoint内部用cmd传参;可以被覆盖
docker 学习笔记_第7张图片
内部定义name之后的内容hello是固定的,可以在环境中定义变量
docker 学习笔记_第8张图片
ENTPYPOINT 调用shell输出内部变量
docker 学习笔记_第9张图片

3.2 pause;stop;-f命令使用

容器层—->commit——>镜像(分层只读)——>共享拉取镜像时候拉取本机没有的层
删除没有退出的容器:

docker container  prune #删除停止的容器==
docker ps -aqf status=exited #过滤停止的容器,f---->filter
docker rm -f `docker ps -aqf status=exited` #删除过滤出来的
docker container pause vm1 #暂停vm1;inspect还有容器信息
docker stop vm1 #终止释放相当与rm
Privileged #true赋予所有权限
设置特权级运行的容器:--privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载
USB 磁盘,修改 MAC 地址等。
# docker run -it --name vm1 ubuntu bash
# docker run -it --name vm2 --privileged=true ubuntu #赋予所有的权限,是以超户身份运行的

docker 学习笔记_第10张图片

4 .内存相关的限制

交换分区作用:当系统内存不足时,交换分区会分给系统交换分区分给内存
默认swap是物理内存的1.5-2倍;
SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用.它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。
SWAP就是LINUX下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用.
它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。
需要注意的是,虽然这个SWAP分区能够作为”虚拟”的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于SWAP,最好的办法仍然是加大物理内存.SWAP分区只是临时的解决办法.
qlinux下得分区推荐一个交换分区,一个根分区,其中交换分区如上所说作为redhat或者其它虚机所划分的内存不够时候来使用!
交换分区(swap)的合理值一般在内存的2 倍左右,可以适当加大。实际上具体还是以实际应用为准,swap为内存的2倍也不过是一种以讹传讹的说法。如果交换分区的使用都超过4GB以上了,可想而知服务器的性能应该差很多了。
Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区,硬盘的空间都已经分配完毕。

docker run -it --name vm1 -m 100M --memory-swap 100M stress --vm 1
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [7] forked
stress: dbug: [7] allocating 268435456 bytes ...
stress: dbug: [7] touching bytes in strides of 4096 bytes ...
stress: FAIL: [1] (416) <-- worker 7 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s
 docker run --rm -it --name vm2 -m 100M --memory-swap 100M stress --vm 1  --vm-bytes 90M


docker run –rm -it –name vm2 -m 100M –memory-swap 100M stress –vm 1 –vm-bytes 110M
docker 学习笔记_第11张图片
docker run –rm -it –name vm1 -m 100M stress –vm 1 –vm-bytes 200M
docker 学习笔记_第12张图片
docker run –rm -it –name vm1 -m 100M stress –vm 1 –vm-bytes 190M
docker 学习笔记_第13张图片
docker run –rm -it –cpu-shares 1024 stress -c 1
docker 学习笔记_第14张图片
docker 学习笔记_第15张图片
当开启的cpu线程数没有超过cpu内核数没有明显的优先级对比
docker run –rm -it –cpu-shares 1024 stress -c 1
docker run –rm -it –cpu-shares 512 stress -c 1
docker 学习笔记_第16张图片
当开启的cpu线程数超过cpu内核数1024的线程明显高于512.
docker run –rm -it –cpu-shares 1024 stress -c 4
docker run –rm -it –cpu-shares 512 stress -c 4
docker 学习笔记_第17张图片
–device-write-bps 写入磁盘速度 oflag=direct写文件忽略缓存

[root@foundation30 ~]# docker run --rm -it --device-write-bps /dev/sda:10M ubuntu
root@4c8109650b2c:/dev# dd if=/dev/zero of=file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.127477 s, 823 MB/s

root@4c8109650b2c:/dev# dd if=/dev/zero of=testfile bs=1M count=100 oflag=direct 
dd: failed to open 'testfile': Invalid argument
root@4c8109650b2c:/dev# cd ..
root@4c8109650b2c:/# dd if=/dev/zero of=testfile bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 9.95648 s, 10.5 MB/s
root@4c8109650b2c:/# 


Iotop 查看磁盘io

5. CGROUP实现资源限制

Cgroup——>资源限制 rhel6.5虚拟机

yum install libcgroup.x86_64  -y
/etc/init.d/cgconfig start
vi /etc/cgconfig.conf
group x1 {
        memory {
                memory.limit_in_bytes = 209715200; #允许写入容量
                #memory.memsw.limit_in_bytes = 209715200; #内存加swap限制容量
                }
}

设置写入限制root用户 当然可以随意写入但是为了我们的空间损耗我们必须设定限制利用cgroup来限定配额;当超过我们的200M内存我们就要在交换分区中写入了这样虽然好但是利用了交换分区就会降低系统运行的速度
docker 学习笔记_第18张图片
memory.memsw.limit_in_bytes = 209715200; #内存加swap限制容量swap只能是内存的1.5-2倍当超过这个限制就会被kill掉
docker 学习笔记_第19张图片

6. 找一个平衡点即满足memapp1;又满足memapp2(5000)

docker 学习笔记_第20张图片

group x2 {
        cpu {
                cpu.shares = 100; 
            }
}
/etc/init.d/cgconfig restart
useradd lee
cd /dev/shm/
vim /etc/cgrules.conf 

docker 学习笔记_第21张图片

/etc/init.d/cgred start
cd
mv memapp* /home/lee/

docker 学习笔记_第22张图片

group x3 {
        blkio {
                blkio.throttle.read_bps_device = "252:0 1000000"; #通过磁盘IO口读写速度限制
            }
}

docker 学习笔记_第23张图片
docker 学习笔记_第24张图片

7. Namespace——>隔离

每个 container 可以有不同的 user 和 group id, 也就是说可以以 container 内部的用户在container 内部执行程序而非 Host 上的用户。
docker 学习笔记_第25张图片
Pull版本官方最新稳定版
docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2.3.1
docker 学习笔记_第26张图片

docker push westos.org:5000/nginx
docker tag nginx localhost:5000/nginx
docker push localhost:5000/nginx

docker 学习笔记_第27张图片
docker 学习笔记_第28张图片
镜像都是分层构建出来的
docker 学习笔记_第29张图片
Localhost:5000/nginx只是删除nginx的命名镜像删除还是删除最原始的镜像
docker 学习笔记_第30张图片
远程加密
docker push westos.org:5000/nginx
docker tag nginx localhost:5000/nginx
docker push localhost:5000/nginx
搭建nginx仓库5000端口做法只能实现本地用户登陆,远程登陆根本无法登陆;我们希望可以通过加密也可以实现远程从仓库下载镜像;因此我们做了443的端口映射和加密证书

cd /tmp/docker/
mkdir certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
#生成制作证书在certs目录下面
docker run -d --restart=always --name registry -v `pwd`/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2 #生成443加密端口以便远程登陆
docker tag nginx westos.org/nginx #建立nginx仓库
cd /etc/docker/
mkdir -p certs.d/westos.org
cd certs.d/westos.org/
cp /tmp/docker/certs/domain.crt ./ca.crt #copy证书
docker push westos.org/nginx #推送nginx镜像生成443---
>5000的端口映射

docker 学习笔记_第31张图片
docker 学习笔记_第32张图片
添加认证:建立认证用户并添加用户密码
为了保证环境的干净我们把之前的volume删除

docker volume rm d81c6c2a8a60ba5d997da08e4c555101ca1eb1ce9217db115e9824cdfe9d7025 
d81c6c2a8a60ba5d997da08e4c555101ca1eb1ce9217db115e9824cdfe9d7025
docker volume ls
DRIVER              VOLUME NAME
 cd .. #注意`pwd`表当前路径所以加密认证要在/tmp/docker执行   
添加认证用户及密码wei;westos
docker run --entrypoint htpasswd registry:2 -Bbn wei westos > auth/htpasswd
cat auth/htpasswd  #生成信息记录在当前目录下的auth/htpasswd文件中
添加两个认证用户
docker run --entrypoint htpasswd registry:2 -Bbn admin admin >> auth/htpasswd
cat auth/htpasswd 
docker ps -a #查看用户进程
[root@foundation30 docker]# htpasswd -cm htpaswd  wei #创建用户新建用户c;再次创建用户不需要加c否则会被覆盖
htpasswd -m htpaswd  admin
docker container prune #暂停容器服务

docker 学习笔记_第33张图片
docker run -d –restart=always –name registry -v pwd/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -v pwd/auth:/auth -e “REGISTRY_AUTH=htpasswd” -e “REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm” -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -p 443:443 registry:2 #添加加密认证,证书位置密钥路径443端口映射

docker push westos.org/rhel7 #推送
docker tag nginx westos.org/nginx #上传镜像
docker login -u wei -p westos westos.org #登陆认证登陆,登陆成功之后下次登陆不用认证
docker 学习笔记_第34张图片
生成认证信息记录在~.docker/config.json文件中
docker 学习笔记_第35张图片

你可能感兴趣的:(docker)