第一种方法:
# 如果是如下方法创建容器
[root@foundation25 kiosk]# docker run -d --name vm1 nginx
b4206bb51bf47b4154b0eb428de7e17811cff4c950203277fc13f58d5a22ec31
# 使用这个方法会进入失败的
[root@foundation25 kiosk]# docker container attach vm1
^C[root@foundation25 kiosk]# # ctrl+c退出来
[root@foundation25 kiosk]# docker start vm1 # 重新开启容器
vm1
# 使用这个方法就可以进入容器了
[root@foundation25 kiosk]# docker container exec -it vm1 bash
root@b4206bb51bf4:/#
root@b4206bb51bf4:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@b4206bb51bf4:/# exit
# 如果是如下这种方法创建,直接进入容器
[root@foundation25 kiosk]# docker run -it --name vm2 nginx bash
root@7e2109f0be58:/#
root@7e2109f0be58:/#
root@7e2109f0be58:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@7e2109f0be58:/# exit
# 使用ctrl+d退出后需要再次开启,也可使用ctrl+pq退出,不需要再开启
[root@foundation25 kiosk]# docker start vm2
vm2
# 再次进入容器可以使用如下命令
[root@foundation25 kiosk]# docker container attach vm2
root@7e2109f0be58:/#
root@7e2109f0be58:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@7e2109f0be58:/# exit
例:http与ssh
[root@foundation25 kiosk]# cd /tmp/docker/
[root@foundation25 docker]# ls
Dockerfile dvd.repo ssh web
# 创建supervisor配置文件
[root@foundation25 docker]# vim supervisord.conf
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
[program:httpd]
command=/usr/sbin/httpd
# 编写文件
[root@foundation25 docker]# vim Dockerfile
FROM rhel7
ENV HOSTNAME server
EXPOSE 22 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd openssh-server openssh-clients 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:redhat | chpasswd
COPY supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord"]
[root@foundation25 docker]# docker build -t rhel7:v3 .
[root@foundation25 docker]# docker run -d --name vm1 -v /tmp/docker/web/:/var/www/html rhel7:v3
# 测试
[root@foundation25 docker]# curl 172.17.0.2
www.redhat.org
[root@foundation25 docker]# ssh -l root 172.17.0.2
区别:
CMD可以被覆盖
ENTRYPOINT不会被覆盖
CMD示例:
[root@foundation25 docker]# mkdir test
[root@foundation25 docker]# cd test/
[root@foundation25 test]# vim Dockerfile
FROM rhel7
CMD echo "hello world!"
[root@foundation25 test]# docker build -t rhel7:v4 .
# 测试
[root@foundation25 test]# docker run --rm rhel7:v4
hello world!
[root@foundation25 test]# docker run --rm rhel7:v4 echo 2018
2018
[root@foundation25 test]# docker rmi rhel7:v4
[root@foundation25 test]# vim Dockerfile
FROM rhel7
ENTRYPOINT echo "hello world!"
[root@foundation25 test]# docker build -t rhel7:v4 .
# 测试
[root@foundation25 test]# docker run --rm rhel7:v4
hello world!
[root@foundation25 test]# docker run --rm rhel7:v4 echo 2018
hello world!
[root@foundation25 test]# docker rmi rhel7:v4
[root@foundation25 test]# vim Dockerfile
FROM rhel7
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
[root@foundation25 test]# docker build -t rhel7:v4 .
# 测试
[root@foundation25 test]# docker run --rm rhel7:v4
hello world
[root@foundation25 test]# docker run --rm rhel7:v4 2018
hello 2018
[root@foundation25 test]# docker run --rm rhel7:v4 test
hello test
[root@foundation25 test]# docker rmi rhel7:v4
[root@foundation25 test]# vim Dockerfile
FROM rhel7
ENV name redhat
ENTRYPOINT ["/bin/sh","-c","echo $name"]
[root@foundation25 test]# docker build -t rhel7:v4 .
# 测试
[root@foundation25 test]# docker run --rm rhel7:v4
redhat
[root@foundation25 test]# docker rmi rhel7:v4
[root@foundation25 test]# vim Dockerfile
FROM rhel7
ENV name redhat
ENTRYPOINT echo "hello $name"
[root@foundation25 test]# docker build -t rhel7:v4 .
[root@foundation25 test]# docker run --rm rhel7:v4
hello redhat
当出现如下权限问题
[root@foundation25 test]# docker run -it --name vm1 ubuntu
root@7f84b47272d2:/# ip addr
46: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
root@7f84b47272d2:/# ip link set down eth0
RTNETLINK answers: Operation not permitted
# 加--privileged=true以超级用户身份运行
[root@foundation25 test]# docker run -it --name vm2 --privileged=true ubuntu
root@34db9fea4081:/# ip addr
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
root@34db9fea4081:/# ip link set down eth0
root@34db9fea4081:/# ip addr
48: eth0@if49: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN group default
root@34db9fea4081:/# ip link set up eth0
root@34db9fea4081:/# ip addr
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
root@34db9fea4081:/# id
uid=0(root) gid=0(root) groups=0(root)
[root@foundation25 test]# docker run --rm -it --name vm3 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 90M
小于限定内存,程序会一直运行
中间省略。。。
可查看top
当大于 锁限定的内存,则会失败
[root@foundation25 test]# docker run --rm -it --name vm3 -m 100M --memory-swap 100M stress --vm 1 --vm-bytes 110M
当没有定义–memory-swap的的大小时,默认为所定义-m大小的两倍,所以,超出-m大小一点点,还可以运行成功
[root@foundation25 test]# docker run --rm -it --name vm3 -m 100M stress --vm 1 --vm-bytes 110M
[root@foundation25 test]# docker run --rm -it --name vm3 -m 100M stress --vm 1 --vm-bytes 200M
查看cpu的个数
[root@foundation25 test]# lscpu
[root@foundation25 test]# docker run --rm -it --cpu-shares 512 stress -c 1
再打开一个shell
运行程序,设置其占用cpu个数为1,优先级为1024
[root@foundation25 test]# docker run --rm -it --cpu-shares 1024 stress -c 1
查看top,由于有四个cpu,完全足够分给两个,所以它们cpu都占100%
当每个占用4个cpu
[root@foundation25 test]# docker run --rm -it --cpu-shares 512 stress -c 4
[root@foundation25 test]# docker run --rm -it --cpu-shares 1024 stress -c 4
[root@foundation25 ~]# docker run --rm -it --device-write-bps /dev/sda:10M ubuntu
root@0b7e69b93507:/# dd if=/dev/zero of=file bs=1M count=100
root@0b7e69b93507:/# dd if=/dev/zero of=file bs=1M count=100 oflag=direct
这里是用虚拟机做的
例:限制内存,使之只能运行memapp1,不能运行memapp2
# 安装此软件包(可以执行先yum search cgroup查询一下)
[root@server1 ~]# yum install libcgroup.x86_64 -y
[root@server1 ~]# /etc/init.d/cgconfig start
# 下载两个安装包 memapp1和memapp2
# 加可执行权限
[root@server1 ~]# chmod +x memapp*
[root@server1 ~]# ./memapp1
[root@server1 ~]# yum install -y /lib/ld-linux.so.2
[root@server1 ~]# ./memapp1
[root@server1 ~]# ./memapp2
# 更改配置文件
[root@server1 memory]# vim /etc/cgconfig.conf
group x1 {
memory {
memory.limit_in_bytes = 17000000;
memory.memsw.limit_in_bytes = 17000000;
}
}
[root@server1 memory]# /etc/init.d/cgconfig restart
# 测试,cgexec -g memory:x1表示让配置文件里的x1内容生效
[root@server1 shm]# cgexec -g memory:x1 /root/memapp1
[root@server1 shm]# cgexec -g memory:x1 /root/memapp2
配置文件的内容,memapp1需要4096页,每页为4kb,所以内存限制在17000000b左右
测试:
[root@server1 ~]# useradd test
[root@server1 ~]# mv memapp* /home/test/
[root@server1 ~]# vim /etc/cgrules.conf
test:memapp1 memory x1
test:memapp2 memory x1
[root@server1 ~]# /etc/init.d/cgred start
# 测试
[root@server1 ~]# su - test
[test@server1 ~]$ ./memapp1
[test@server1 ~]$ ./memapp2
[root@server1 ~]# vim /etc/cgconfig.conf
group x2 {
cpu {
cpu.shares = 100; # 限制到10%
}
}
[root@server1 ~]# /etc/init.d/cgconfig restart
# 查看cpu个数
[root@server1 ~]# cd /sys/devices/system/cpu
[root@server1 cpu]# ls
# 测试
[root@server1 cpu]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[1] 1237
[root@server1 cpu]# top
[root@server1 cpu]# dd if=/dev/zero of=/dev/null &
[2] 1239
[root@server1 cpu]# top
配置文件内容:
测试:
有一个cpu足够分配给它,所以所占cpu几乎为100%
再开一个的时候,一个cpu要分配给两个,第一个就会被限制,只占10%(创建的时候,配置文件的cpu限制对第一个生效)
[root@server1 cpu]# cd /cgroup/blkio/
[root@server1 blkio]# ll /dev/vda
[root@server1 ~]# vim /etc/cgconfig.conf
[root@server1 ~]# /etc/init.d/cgconfig restart
group x3 {
blkio {
blkio.throttle.read_bps_device = "252:0 1000000"; #IO读取速度为1M/s
}
}
# 测试
[root@server1 ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[3] 11648
[root@server1 ~]# yum install -y iotop
[root@server1 ~]# iotop
[root@foundation25 ~]# docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2
[root@foundation25 ~]# docker push localhost:5000/nginx
[root@foundation25 ~]# ls /opt/registry
[root@foundation25 ~]# cd /tmp/docker/
[root@foundation25 docker]# mkdir certs
[root@foundation25 docker]# cd certs/
[root@foundation25 certs]# ls
[root@foundation25 certs]# mv domains.crt domain.crt
[root@foundation25 certs]# cd ..
[root@foundation25 docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domains.crt
[root@foundation25 docker]# 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
[root@foundation25 certs]# docker ps