比较Docker和虚拟技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个操作系统上安装和运行软件
- 容器的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟硬件,所以轻便了
- 每个容器间互相隔离,每个容器内都有属于自己的文件系统,互不影响。
docker介绍
镜像(image)
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,Tomcat镜像===》run===》Tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)。
容器(container)
docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本指令!
目前就可以把这个容器理解为就是一个简易的Linux系统。
仓库(repository)
仓库就是存放镜像的地方。
仓库分为公有仓库和私有仓库。
安装
- 卸载老的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 需要的安装包
yum install -y yum-utils
- 设置镜像的仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker相关的内容
更新yum软件包索引
yum makecache fast
-ce 是社区版的
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 启动
systemctl start docker
# 启动后使用version查看是否启动成功
docker version
- hellow world
docker run hello-world
- 查看下载的Hellow world镜像
docker images
- 卸载docker
yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
rm -rf /var/lib/docker # docker默认的工作路径
rm -rf /var/lib/containerd
命令
docker命令
- 启动:systemctl start docker
- 停止:systemctl stop docker
- 重启:systemctl restart docker
- 查看状态:systemctl status docker
- 设置开机启动:systemctl enable docker
镜像命令
查看所有镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
- REPOSITORY :镜像的仓库源
- TAG:镜像的版本标签
- IMAGE ID:镜像的id
- CREATED:镜像的创建时间
- SIZE:镜像的大小
搜索镜像
docker search mysql # 搜索mysql的镜像
docker search --help
# 搜索镜像命令可选项
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 查询一条
docker search mysql --limit 1
拉取镜像
docker pull p3terx/aria2-pro # aria2-pro下载器镜像
docker pull p3terx/ariang # 下载器的图形化界面
docker pull p3terx/aria2-pro:latest # latest 为版本号,可以选定版本号下载
删除镜像
docker rmi -f feb5d9fea6a5 # feb5d9fea6a5 为image id
导出镜像
docker save tomcat -o /soft/tmpfile/tomcat.tar
# save为导出命令,Tomcat为镜像名称,-o指定保存文件名,必须指定文件名且为tar包
导入镜像
docker load -i /soft/tmpfile/tomcat.tar
# load为导入,-i为指定要导入的镜像文件
容器转为镜像命令
docker commit 8045860ae2db tomcat_new:1.0
# 8045860ae2db为容器id,tomcat_new:1.0 tomcat_new为生成的镜像名称,1.0为镜像版本,此种方式生成的镜像不会保留之前容器的数据卷,其他的文件修改会报错,
# 执行此命令后,会把镜像提交到本地的docker,通过docker images可以查看新生成的镜像
容器命令
说明:有了镜像才可以创建容器,
新建容器并启动
docker run -it p3terx/aria2-pro # p3terx/aria2-pro为镜像名称, -it为可以交互
docker run -id --name=容器名 -p8081:8081 p3terx/aria2-pro # --name 给容器创建名称,-it 和-id的区别是一个是交互式,一个是守护式,交互式就是启动后直接进入容器,通过exit退出后容器会关闭,守护式是需要启动后通过docker exec 进入容器,退出容器后不会关闭
# -p 端口映射,冒号前面为宿主机端口,冒号后面为容器端口
后台启动后进入容器
docker exec -it silly_faraday /bin/bash # silly_faraday为容器名称, /bin/bash为shelll命令,固定所有容器都一样,使用 docker ps显示的NAMES列和COMMAND列
显示正在运行的容器
docker ps -aq
# -a 显示正在运行和历史运行过的容器 -q 只显示容器的id
退出容器
exit 或者ctrl + c # 直接容器停止并退出
Ctrl + p + q # 容器不停止退出
删除容器
docker rm 容器id # 删除单个容器,不能删除正在运行的容器,如果要强制删除 加 -f
docker rm -f $(docker ps -aq) # 递归删除所有容器
启动和停止容器
docker start 容器id或者容器docker images结果的REPOSITORY列的值
docker restart 容器id
docker stop 容器id
docker kill 容器id # 强制停止容器
查看容器日志
docker logs -ft --tail 100 容器id
查看容器详细信息
docker inspect 容器name # 包含容器ip和端口号等信息
docker数据卷
概念
- 数据卷 是宿主机的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以挂载多个数据卷
作用 - 容器数据持久化到宿主机的数据卷
- 外部机器和容器间接通信
- 容器之间数据交换
配置数据卷
创建容器时,使用-v参数设置数据卷
docker run ... -v 宿主机目录(文件):容器目录(文件) ...
# 目录必须是绝对路径
# 如果目录不存在,会自动创建
# 可以挂载多个数据卷
样例
docker run -it --name=centos1 -v /soft/containerData:/root/container_data -v /soft/containerData2:/root/container_data2 centos
# 如果挂载多个目录,则用多个-v命令
Dockerfile
作用:利用现有镜像生成一个新的镜像
dockerfile案例
FROM centos # 选择基础镜像
MAINTAINER 1111 <aaa.com> # 编写人
# RUN yum install -y vim # 执行安装vim命令
WORKDIR /usr # 进入容器后的目录
cmd /bin/bash # 进入容器的命令
利用dockerfile生成新镜像的命令
docker build -f ./centos_dockerfile -t new_centos:1.0 .
# -f 执行dockerfile文件 -t 指定生成的新的镜像的名称和版本
异常情况
端口映射后外网无法访问
参考:https://www.yisu.com/zixun/631744.html
一开始使用命令sysctl net.ipv4.ip_forward查看结果为0,最终通过了重启docker,systemctl restart docker,再执行sysctl net.ipv4.ip_forward变为了1,再次重启容器就可以通过外网访问了,