Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
环境准备:
Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
1.卸载旧的版本
sudo 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.设置镜像的仓库(阿里云)
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包索引
yum makecache fast
4.安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
5.启动docker
sudo systemctl start docker
6.查看是否安装成功
docker version
docker run hello-world
8.查看一下下载的hello-world镜像
docker images
9.卸载docker
# 1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2.删除资源
rm -rf /var/lib/docker
10.配置阿里云镜像加速器
登录阿里云,找到容器镜像服务,点击镜像加速器,然后依次执行命令即可。
# 应该只能使用自己的
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://i2902kmw.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker Run的流程
docker底层原理
Docker是一个 Client-Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问。
docker与虚拟机区别
Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。
虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。
# 查看基本信息
docker version
# 系统信息,包括镜像和容器数
docker info
# 万能命令
docker 命令 --help
# 列出本地镜像
docker images
# 具体使用方法可以输入命令 docker images --help
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Format output using a custom template:
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
# 从Docker Hub查找镜像
docker search [OPTIONS] TERM
OPTIONS说明:
# 从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 不写tag,默认就是最新版本
# 拉取最新的java镜像
docker pull java
# 从Docker Hub下载REPOSITORY为java的所有镜像
docker pull -a java
# 拉取指定版本
docker pull mysql:5.7
# 删除本地一个或多个镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
# 举例
# 删除单个
docker rmi -f 容器id
# 删除多个
docker rmi -f 容器id 容器id 容器id...
# 删除全部容器
docker rmi -f $(docker images -aq)
OPTION说明:
说明:我们有了镜像才可以创建容器,下载一个centos镜像。
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" # 容器名字,区分容器
-d # 后台方式运行
-it # 使用交互方式允许,进入容器查看内容
-p # 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P # 随机指定端口
# 测试,启动并进入容器
[root@iZ0jl2pjllvr5lfp1bkua1Z ~]# docker run -it centos /bin/bash
[root@f1a9e93b0ff6 /]#
# 查看内部
[root@f1a9e93b0ff6 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 从容器退回主机
exit
exit # 直接退出容器并关闭
Ctrl + P + Q # 容器不关闭退出
# 列出容器
docker ps [OPTIONS]
# 列出当前加历史允许过的容器
docker ps -a
OPTIONS说明:
# 删除一个或多个容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 删除指定容器,不能删除正确允许的容器,如果强制删除rm -f
docker rm 容器id
# 删除所有的容器
docker rm -f $(docker ps -aq)
# 启动一个或多个已经被停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 启动
docker start 容器id
# 停止一个运行中的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 停止
docker stop 容器id
# 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 重启
docker restart 容器id
# 杀掉一个运行中的容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]
# 杀掉
docker kill 容器id
# 命令 docker run -d 镜像名
docker run -d centos
# 问题docker ps 发现 centos停止
# 常见的坑, docker 容器使用后台运行, 就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx, 容器启动后,发现自己没有提供服务,就会立即停止,就是没有程序
# 获取容器的日志
docker logs [OPTIONS] CONTAINER
# 显示容器10条日志
docker logs -tf --tail 10 f272a950b815
OPTIONS说明:
# 查看容器中运行的进程信息,支持 ps 命令参数
docker top [OPTIONS] CONTAINER [ps OPTIONS]
# 举例
docker top f272a950b815
# 获取容器/镜像的元数据
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# 举例
docker inspect f272a950b815
# 在运行的容器中执行命令
# 进入容器后开启一个新的终端,可以在里面操作
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 举例
docker exec -it f272a950b815 /bin/bash
# 连接到正在运行中的容器
# 进入容器正在执行的终端,不会启动新的进程
docker attach [OPTIONS] CONTAINER
# 举例
docker attach f272a950b815
# 用于容器与主机之间的数据拷贝
docker cp 容器id:容器内路径 目的地主机路径
docker cp 3ff49a3c1032:/home/test.java /home
学习docker过程中,搞不清镜像与容器的关系,把它们搞混淆分不清。
简单点理解:docker容器是由docker镜像创建的运行实例。