Docker基础操作
1. Docker概念
镜像(image): Docker镜像就像一个模板,可通过这个模板来创建容器服务,通过镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)。
容器(container):Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。启动、停止、删除,基本命令。目前就可以把这个容器理解为就是一个简易的linux系统。
仓库(repository):仓库就是存放镜像的地方!仓库分为共有仓库、私有仓库。
2. Docker安装
2.1 准备工作
操作系统:CentOS 7
系统内核是3.10以上的。 查看命令:uname -r
[root@localhost ~]# uname -r 3.10.0-862.el7.x86_64
查看系统版本。查看命令:cat /etc/os-release
[root@localhost ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
帮助文档:https://docs.docker.com/engine/install/centos/
# 1. 卸载旧的版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 2. 需要的安装包 yum install -y yum-utils # 3. 设置镜像仓库 # 国外的地址 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 阿里云的镜像仓库地址 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 提前更新yum软件包索引 yum makecache fast # 4. 安装docker docker-ce社区版 docker-ee企业版 sudo yum install docker-ce docker-ce-cli containerd.io 默认安装最新的版本 查看其它版本的docker yum list docker-ce --showduplicates | sort -r 安装指定版本的docker sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io # 5. 启动docker systemctl start docker # docker设置开机启动 [root@localhost ~]# systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. # 6. 查看docker版本号,验证是否安装成功 docker version # 7. 测试docker,运行hello world docker run hello-world # 8. 查看docker是否下载,查看docker列表 docker images
2.3 卸载Docker
# 1. 卸载依赖 yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源 rm -rf /var/lib/docker rm -rf /var/lib/containerd # /var/lib/docker是Docker的默认工作路径
2.4 底层原理
Docker是怎么工作的?Docker是一个Client-Server结构的系统,Docker是守护进程运行在主机上,通过Socket从客户端访问!Docker接收到Docker-Client指令,就会执行这个命令。
Docker为什么比虚拟机快?1.Docker有着比虚拟机更少的抽象层。2.Docker利用的是宿主机的内核,虚拟机需要是Guest OS(操作系统内核)。
所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机加载Guest OS,分钟级别的,而Docker是利用宿主机的操作系统,省略了这个复杂的过程,秒级。
3 Docker命令
官方Docker命令列表:https://docs.docker.com/engine/reference/run/
3.1 帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器
docker 命令 --help # 帮助命令,展示指定命令的相关参数
3.2 镜像命令
3.2.1 docker images 查看所有本地主机上的镜像
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 5 weeks ago 13.3kB
解析
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
命令可选项
-a, --all # 列出所有镜像
-f, --filter # 根据提供的条件过滤
-q, --quiet # 只显示镜像的ID
3.2.2 docker search 搜索镜像(在仓库搜索)
[root@localhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 10748 [OK] mariadb MariaDB Server is a high performing open sou… 4047 [OK]
可选项,通过搜索条件过滤
-f, --filter
举例:docker search mysql --filter=STARS=5000
3.2.3 docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag] [root@localhost ~]# docker pull mysql Using default tag: latest # 如果不写tag,默认就是latest最新版本 latest: Pulling from library/mysql f7ec5a41d630: Pull complete # 分层下载,docker image的核心,联合文件系统 9444bb562699: Pull complete # 每一层都可能被其他镜像复用,避免重复下载 6a4207b96940: Pull complete 181cefd361ce: Pull complete 8a2090759d8a: Pull complete 15f235e0d7ee: Pull complete d870539cd9db: Pull complete 5726073179b6: Pull complete eadfac8b2520: Pull complete f5936a8c3f2b: Pull complete cca8ee89e625: Pull complete 6c79df02586a: Pull complete Digest: sha256:6e0014cdd88092545557dee5e9eb7e1a3c84c9a14ad2418d5f2231e930967a38 #签名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest #真实地址
下面这两个docker是等价的
docker pull mysql docker pull docker.io/library/mysql:latest docker pull mysql:5.7 # 指定下载mysql版本
3.2.4 docker rmi 删除镜像
docker rmi -f 镜像ID # 根据指定的镜像
docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像
docker rmi -f ${docker images -aq} # 删除所有镜像
3.3 容器命令
说明:我们有了镜像才可以创建容器。
下载一个centos镜像来学习。
docker pull centos
3.3.1 docker run image 新建容器并启动
docker run [可选参数] image
参数说明:
--name="Name" 容器的名字,如:tomcat1 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P 随机指定端口
#测试,启动并进入容器 [root@localhost ~]# docker run -it centos /bin/bash (/bin/bash是CentOS的交互控制台,localhost是宿主机主机名) [root@aacf88006d8f /]# ls # 进入后主机名变成了容器ID=aacf88006d8f # 从容器中退回主机 exit
3.3.2 docker ps 列出所有的运行容器
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aacf88006d8f centos "/bin/bash" 2 minutes ago Up 2 minutes intelligent_pike
参数说明:
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示当前创建的容器
-q # 只显示容器的编号
3.3.3 exit 退出容器
exit # 直接容器停止并退出
ctrl + P + Q # 容器不停止退出
3.3.4 docker rm 删除容器
docker rm 容器Id # 删除指定容器,不能删除正在运行的容器,强制删除:rm -f
docker rm -f ${docker images -aq} # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器
3.3.5 启动和停止容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
3.4.1 后台启动容器
docker run -d 镜像名
例如:docker run -d centos
# 问题docker ps,发现centos停止了
# 常见的坑,docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
3.4.2 查看日志
docker logs
docker logs -tf 容器ID # 查看指定容器的日志
docker logs -tf --tail 10 容器ID # 查看指定容器的日志,只要前10行
# 编写一个shell,创造日志 docker run -d centos /bin/sh -c "while true;do echo ahahahah;sleep 1;done"
3.4.3 查看容器中的进程信息
docker top 容器ID # 查看指定容器的进行信息
[root@localhost ~]# docker top aacf88006d8f UID PID PPID C STIME TTY TIME CMD root 46390 46368 0 16:34 ? 00:00:00 /bin/bash
3.4.4 查看镜像的元数据
docker inspect 容器ID
3.4.5 进入当前正在运行的容器
通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
docker exec -it 容器ID
docker exec -it 容器ID /bin/bash
方式2:
docker attach 容器ID
区别:
docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach # 进入容器正在执行的终端,不会启动新的进程
3.4.6 从容器拷贝文件到主机
docker cp # 容器ID:容器内路径 主机路名
测试:
docker cp aacf88006d8f:/home/test.java /home
查看docker 容量
1. df -h 查看系统容量情况
2. 进入 /var/lib/docker 用 du -sh * 查看当前路径下的文件和文件夹容量情况
3. 上一步会发现 containers 和 overlay2 都很大,但是其实 containers 是会每天变大的
4. 进入 containers,du -sh * 发现哪个容器特别大
5. 进入对应的容器ID,用 cat /dev/null > *-json.log 清理容器