文章目录
云计算核心:Docker
一、安装
1.Docker加速器
使用Aliyun Docker Yum源安装Docker
yum install -y yum-utils device-mapper-persistent-data lvm2 git
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.安装指定版本
查看版本
yum list docker-ce --showduplicates
安装较旧版本(比如Docker 17.03.2) :
需要指定完整的rpm包的包名,并且加上–setopt=obsoletes=0 参数:
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
安装最新版
yum install docker-ce -y
二、启动docker
systemctl start docker
systemctl enable docker
查看docker 版本
docker -v
查看docker 启动状态
docker version
查看docker 运行状态
docker info
三、镜像管理
搜索镜像 [任意关键词]
这种方法只能用于官方镜像库
docker search centos
按星级搜索镜像
查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 ubuntu 镜像
docker search ubuntu -f stars=100
拉取镜像
docker pull centos
查看本地镜像
docker images
四、 使用镜像
1.使用阿里云镜像源 加速镜像下载
需要登录阿里云服务器 不需要有云服务器
具体操作摘自 某位运维开发的文章 把 Docker 容器当做虚拟机使用
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://********.mirror.aliyuncs.com"]
}
EOF
2.启动镜像
sudo systemctl daemon-reload
sudo systemctl restart docker
3.查看镜像详情
docker ps -a
4.删除镜像
删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
docker rm docker-1
强制删除:–force
如果镜像正在被使用中可以使用–force强制删除
docker rm docker-1 --force
删除所有镜像
docker rm $(docker images -q)
只查看所有镜像的id
docker images -q
查看镜像制作的过程,相当于Dockerfile
docker history daocloud.io/ubuntu
给镜像打tag
docker tag daocloud.io/ubuntu daocloud.io/ubuntu:v1
5.进入容器
docker run -it centos
6.关闭容器
docker stop docker-1
五、什么是Docker?[演示]
模拟一个文件系统
[root@docker ~]# cd
[root@docker ~]# mkdir t
#模拟一个文件系统
[root@docker ~]# mkdir t/{bin,lib64,etc,home,root}
[root@docker ~]# ls t/
bin etc home lib64 root
#把ls命令放到我的文件系统内
[root@docker ~]# cp /usr/bin/ls t/
[root@docker ~]# ls t/
bin etc home lib64 ls root
[root@docker ~]# ldd /usr/bin/ls |grep -oP '/lib64/\S+'
/lib64/libselinux.so.1
/lib64/libcap.so.2
/lib64/libacl.so.1
/lib64/libc.so.6
/lib64/libpcre.so.1
/lib64/libdl.so.2
/lib64/ld-linux-x86-64.so.2
/lib64/libattr.so.1
/lib64/libpthread.so.0
[root@docker ~]# ldd /usr/bin/ls |grep -oP '/lib64/\S+' | cp `xargs` t/lib64/
[root@docker ~]# ls t/lib64/
ld-linux-x86-64.so.2 libattr.so.1 libc.so.6 libpcre.so.1 libselinux.so.1
libacl.so.1 libcap.so.2 libdl.so.2 libpthread.so.0
[root@docker ~]# ls t/
bin etc home lib64 ls root
[root@docker ~]# chroot t /ls
bin etc home lib64 ls root
#把bash命令放到我的文件系统内
[root@docker ~]# cp /bin/bash t/
[root@docker ~]# ldd /bin/bash |grep -oP '/lib64/\S+' |cp `xargs` t/lib64/
[root@docker ~]# chroot t/
bash-4.2# echo "hah"
hah
[root@docker ~]# tar -czf t.tar t
[root@docker ~]# ls t.tar
t.tar
#这里的 t.tar 就是一个 Docker [容器]
六、Docker容器的制作
1.创建新容器但不启动
需要持续交互 使用 -it
docker create -it daocloud.io/library/centos:5 /bin/bash
更多参数
-i
捕获标准输入输出
-t
分配一个终端或控制台
-d
后台启动
--restart=always
容器随docker engine自启动,因为在重启docker的时候默认容器都会被关闭
也适用于create选项
--rm
默认情况下,每个容器在退出时,它的文件系统也会保存下来,这样一方面调试会方便些,因为你可以通过查看日志等方式来确定最终状态。另一方面,也可以保存容器所产生的数据。
但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。这个时候就需要--rm参数了。注意:--rm 和 -d不能共用
容器名称
--name= Assign a name to the container
--为容器分配一个名字,如果没有指定,docker会自动分配一个随机名称
是docker run子命令的参数
可以通过三种方式调用容器命名:
1)使用UUID长命名("f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778")
2)使用UUID短Id("f78375b1c487")
3)使用Name("docker-1")
这个UUID标识是由Docker deamon生成的。
如果你在执行docker run时没有指定--name,那么deamon会自动生成一个随机字符串UUID。
但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容
器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。
保存容器PID equivalent:
如果在使用Docker时有自动化的需求,你可以将containerID输出到指定的文件中(PIDfile),类似于某些应用程序将自身ID输出到文件中,方便后续脚本操作。
--cidfile="": Write the container ID to the file
启动容器
启动容器必须需要启动容器的时候需要有 -d 参数
否则不会启动成功
docker start docker-1
停止容器
docker stop docker-1
docker kill docker-1 # 强制终止容器
查看所有容器
docker ps -a
-a 所有
查看已启动容器
docker ps
查看所有容器id
docker ps -a -q
2.自启动
容器随docker engine
自启动
因为在重启docker的时候默认容器都会被关闭
docker run -it --restart=always centos /bin/bash
3.查看容器详细信息
docker inspect 0 #这里0 是我机器上运行的唯一标识id
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04270d042318 centos "/bin/bash" 2 minutes ago Up 2 minutes docker-3
e63dca6e4930 centos "/bin/bash" 23 minutes ago Up 15 seconds docker-1
[root@docker ~]# docker inspect 0
[
{
"Id": "04270d0423180793d5a2959124818534911b4d5abca6d21f5d1d2cf721cf2bc9",
"Created": "2021-01-12T08:49:40.365041161Z",
"Path": "/bin/bash",
...
根据格式删除容器
docker rm $(docker ps -qf status=exited)
查看系统历史命令
docker logs docker-1
查看所有进程
docker容器中的top 命令
docker top docker-1
复制
docker cp xxxx
4.创建对应端口的应用服务
docker run -d -p 8090:80 --name nginx nginx
docker run -d -p 6379:80 --name redis redis
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68c99094b335 nginx "/docker-entrypoint.…" 6 seconds ago Up 5 seconds 0.0.0.0:8090->80/tcp nginx
560de3c6cbff redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp, 0.0.0.0:6379->80/tcp redis
e63dca6e4930 centos "/bin/bash" 2 hours ago Up About an hour docker-1
5.创建任务 exec
#交互型
docker exec -itd docker-1 touch 1.txt
docker exec docker-1 mkdir test
#后台型
docker exec docker-1 touch 2.txt
#进入容器
docker exec -it e63 bash
6.查看容器内发生改变的文件
包括文件的创建、删除和文件内容的改变都能看到
[root@docker ~]# docker diff docker-1
A /test
A /2.txt
A /1.txt
7.连接容器[进入容器]
docker attach docker
或者
docker exec -it e63
进入
[root@docker ~]# docker attach docker-1
[root@e63dca6e4930 /]# ls
1.txt bin etc lib lost+found mnt proc run srv test usr
2.txt dev home lib64 media opt root sbin sys tmp var
七、CPU 限制
先写一个脚本,让他无限占用cpu
[root@localhost ~]# cat /root/shark.sh
while true
do
true
done
然后执行他 cpu会飙升到100%
[root@localhost ~]# sh /root/shark.sh &
[1] 69950
查看进程 记住进程号
[root@localhost ~]# top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
69950 root 20 0 113280 1196 1020 R 70.8 0.1 0:32.11 sh
进入cpu配置文件 创建一个新文件夹
[root@localhost cpu]# mkdir t
[root@localhost t]# pwd
/sys/fs/cgroup/cpu/t
[root@localhost t]# echo 20000 > cpu.cfs_quota_us # 20000 表示最高占用cpu不超过20% 自己视情况而定
[root@localhost t]# echo 64514 > tasks # 把刚刚的进程号写入这个文件内
#cpu的负载就会到达你所期望的值
八、卸载删除已安装Docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine