docker学习笔记
docker安装
安装docker
#1、安装docker依赖
yum install -y yum-utils
#2、配置仓库镜像
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3、将yum源升至最新
yum makecache fast
#4、安装docker社区版
yum install docker-ce docker-ce-cli containerd.io -y
#5、启动docker服务
systemctl start docker
#6、使用docker运行简单程序
docker run hello-world
阿里云镜像加速
- 登陆阿里云——容器镜像服务——镜像加速器
- 配置使用
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xpzlh5uz.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker运行流程
底层原理
- Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问
- DockerServer收到Docker-Client的指令,会执行此命令
Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- docker利用的是宿主机的内核,vm需要重新加载一个操作系统内核
- 新建容器时,不加载操作系统内核,避免引导
docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker系统信息,包括进项和容器的数量
docker 命令 --help #万能命令
帮助文档的地址:https://docs.docker.com/reference/
镜像命令
docker images 查看所有本地的主机上的镜像
[root@10-23-179-224 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 11 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的id
docker search 搜索镜像
[root@10-23-179-224 ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10247 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3785 [OK]
# 可选项 通过搜索来过滤
--filter=STARS=3000 # 搜索出来的镜像的STARS大于3000
[root@10-23-179-224 ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10247 [OK]
# 等价于 docker search mysql --filter STARS=3000
docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag]
[root@10-23-179-224 ~]# docker pull mysql
Using default tag: latest # 不写tag,默认为lastest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete # 分层下载,docker image的核心 联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
9f2c4202ac29: Pull complete
a369b92bfc99: Pull complete
Digest: sha256:365e891b22abd3336d65baefc475b4a9a1e29a01a7b6b5be04367fcc9f373bb7 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 等价于
# docker pull mysql
# docker pull docker.io/library/mysql:latest
# 指定版本下载
[root@10-23-179-224 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
6ec7b7d162b2: Already exists # 存在的就不下载了
fedd960d3481: Already exists
7ab947313861: Already exists
64f92f19e638: Already exists
3e80b17bff96: Already exists
014e976799f9: Already exists
59ae84fee1b3: Already exists
7d1da2a18e2e: Pull complete
301a28b700b9: Pull complete
979b389fc71f: Pull complete
403f729b1bad: Pull complete
Digest: sha256:d4ca82cee68dce98aa72a1c48b5ef5ce9f1538265831132187871b78e768aed1
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
[root@10-23-179-224 ~]# docker rmi -f 镜像id # 删除指定的镜像
[root@10-23-179-224 ~]# docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像
[root@10-23-179-224 ~]# docker rmi -f $(docker images -aq) # 删除全部的镜像
容器命令
有镜像才可以创建容器
docker pull centos #下载centos镜像来测试
新建容器并启动
docker run [可选参数] imageid
# 参数说明
--name="Name" 容器名字,用于区分容器
-d 后台方式运行,类似nohup
-it 使用交互方式运行,进入容器查看内容(默认/bin/bash)
-p 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P 随机指定端口
# 测试 启动并进入容器
[root@10-23-179-224 ~]# docker run -it centos /bin/bash
[root@f5351f82a819 /]# ls # 查看容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器中退回主机
[root@f5351f82a819 /]# exit 容器关闭
exit
[root@10-23-179-224 ~]#
列出所有的运行的容器
# docker ps命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器 + 带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
[root@10-23-179-224 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@10-23-179-224 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5351f82a819 centos "/bin/bash" 5 minutes ago Exited (127) 2 minutes ago sleepy_galileo
02eb7f9b48ca bf756fb1ae65 "/hello" 22 hours ago Exited (0) 22 hours ago serene_grothendieck
11ca0fc61486 bf756fb1ae65 "/hello" 22 hours ago Exited (0) 22 hours ago intelligent_mirzakhani
[root@10-23-179-224 ~]# docker ps -aq
f5351f82a819
02eb7f9b48ca
11ca0fc61486
[root@10-23-179-224 ~]# docker ps -a -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5351f82a819 centos "/bin/bash" 7 minutes ago Exited (127) 4 minutes ago sleepy_galileo
退出容器
exit # 直接容器停止并退出
ctrl + P + Q # 容器不停止退出(注意按的顺序)
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,强制删除需要rm -f
docker rm -f $(docker ps -aq)# 删除所有的容器
docker ps -aq | xargs docker rm # 删除所有的容器
启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前正在运行的容器
常用其他命令
后台启动容器
# 命令 docker run -d 镜像名
[root@10-23-179-224 ~]# docker run -d centos
# 问题 docker ps ,发现centos停止
# 常见的坑:docker 容器使用后台运行,就必须要有一个前台进程(docker如果发现没有应用,就会自动停止)
# nginx 容器启动后发现没有提供服务,就会立刻停止
查看日志
docker logs -f -t --tail 容器id # 没有日志
# 编写shell脚本
[root@10-23-179-224 ~]# docker run -d centos /bin/sh -c "while true;do echo light;sleep 1;done"
# [root@10-23-179-224 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccba62e234c5 centos "/bin/sh -c 'while t…" 3 seconds ago Up 2 seconds lucid_diffie
# 显示日志
-tf # 显示日志
--tail number # 要显示的日志条数
[root@10-23-179-224 ~]# docker logs -tf --tail 10 ccba62e234c5
查看容器中进程信息ps
# 命令 docker top 容器id
[root@10-23-179-224 ~]# docker top ccba62e234c5
UID PID PPID C STIME
root 28829 28810 0 21:46
root 29485 28829 0 21:54
查看镜像的元数据
# 命令
docker inspect 容器id
# 测试
[root@10-23-179-224 ~]# docker inspect ccba62e234c5
[
{
"Id": "ccba62e234c5513c626ca785ea874c889bd4cbed749daf79352422e41a64efea",
"Created": "2020-12-12T13:46:23.675183068Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo light;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 28829,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-12-12T13:46:24.023284286Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/ccba62e234c5513c626ca785ea874c889bd4cbed749daf79352422e41a64efea/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/ccba62e234c5513c626ca785ea874c889bd4cbed749daf79352422e41a64efea/hostname",
"HostsPath": "/var/lib/docker/containers/ccba62e234c5513c626ca785ea874c889bd4cbed749daf79352422e41a64efea/hosts",
"LogPath": "/var/lib/docker/containers/ccba62e234c5513c626ca785ea874c889bd4cbed749daf79352422e41a64efea/ccba62e234c5513c626ca785ea874c889bd4cbed749daf79352422e41a64efea-json.log",
"Name": "/lucid_diffie",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {
}
},
"NetworkMode": "default",
"PortBindings": {
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],