Docker是一种轻量级的虚拟化技术,同时是一个开源的应用容器运行环境搭建平台,可以让开发者以便捷方式打包应用到一个可移植的容器中,然后安装至任何运行Linux或Windows等系统的服务器上。相较于传统虚拟机,Docker容器提供轻量化的虚拟化方式、安装便捷、启停速度快。
Docker和传统虚拟化方式的不同之处
docker官网:https://www.docker.com/
Docker Hub 官网(镜像仓库):https://hub.docker.com/
Docker 并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境,所以 Docker 必须部署在Linux内核系统上
镜像(image)
、容器(container)
、仓库(repository)
是docker的基本组成
安装最新版本docker命令
bash# 安装之前需要先安装编译器
yum install -y gcc gcc-c++
# yum-utils 提供了 yum-config-manager
yum install -y yum-utils
# 配置官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker Engine、containerd 和 Docker Compose
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
修改配置文件,设置docker默认使用数据盘,启动 Docker
bashmkdir /data
cat > /etc/docker/daemon.json <<'EOF'
{
"data-root": "/data/docker"
}
EOF
systemctl start docker
测试是否安装成功
bashdocker run hello-world
卸载命令:
bash# 停止docker
systemctl stop docker
# 删除安装包
yum remove docker-ce docker-ce-cli containerd.io
# 删除镜像、容器、配置文件等内容
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
systemctl enable docker
docker info
docker --help
docker 具体命令 --help
列出主机上的镜像:docker images
标题 | 说明 |
---|---|
REPOSITORY | 表示镜像的仓库源 |
TAG | 镜像的标签版本号 |
IMAGE ID | 镜像ID |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
参数说明
-a:列出本地所有镜像(含历史映像层)
-q:只显示镜像ID
搜索镜像:docker search [OPTIONS] 镜像名字
标题 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像描述 |
STARS | 点赞数量 |
OFFICIAL | 是否为官方的 |
AUTOMATED | 是否是自动构建的 |
如果不想列出全部镜像,可以使用 OPTIONS 参数: 只列出N个镜像,默认25个,示例(列出排名前5个镜像): docker search --limit 5 redis
拉取镜像:docker pull 镜像名字[:TAG]
,TAG就是版本号,不写默认就是最新的版本。
查看镜像/容器/数据卷所占的空间:docker system df
删除镜像:docker rmi 镜像ID
,加上 -f 参数可以强制删除
docker rmi -f 镜像ID
docker rmi -f 镜像名1:TAG 镜像名2:TAG
docker rmi -f $(docker images -qa)
新建+启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
,OPTIONS说明:有些是一个减号,有些是两个减号
示例:docker run -it --name=myu1 ubuntu /bin/bash
--name="容器新名字"
:给容器起一个名字-d
:后台运行容器并返回容器ID,即启动守护式容器-i
:以交互模式运行容器,通常与 -t
同时使用-t
:为容器重新分配一个伪输入终端,通常与 -i
同时使用,即启动交互式容器(前台有伪终端,等待交互)-P
:随机端口映射,大写P,宿主机随机端口:容器端口
-p
:指定端口映射,小写p,宿主机指定端口:容器端口
列出所有正在运行的容器:docker ps [OPTIONS]
,OPTIONS说明:
-a
:列出当前所有正在运行的容器+历史上运行过的-l
:显示最近创建的容器-n
:显示最近n个创建的容器-q
:静默模式,只显示容器编号退出容器,有两种退出方式
exit
退出,容器停止ctrl+p+q
退出,容器不停止启动已停止运行的容器:docker start 容器ID或容器名
重启容器:docker restart 容器ID或容器名
停止容器:docker stop 容器ID或容器名
强制停止容器:docker kill 容器ID或容器名
删除已停止的容器:docker rm 容器ID
,删除全部容器:docker rm -f $(docker ps -a -q)
,-f参数是强制删除。
后台运行容器:docker run -d 容器名 /bin/bash
,docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是一直挂起的命令(比如运行top,tail),就会自动退出。
查看指定容器日志:docker logs 容器ID
查看容器内运行的进程:docker top 容器ID
查看容器内部细节:docker inspect 容器ID
进入正在运行的容器并以命令行交互,推荐使用 docker exec -it 容器ID /bin/bash
命令:
docker exec -it 容器ID /bin/bash
:exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。docker attach 容器ID
:attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。从容器内拷贝文件到主机:docker cp 容器ID:容器内路径 目的主机路径
导入和导出容器:
docker export 容器ID > filename.tar
:导出容器的内容留作为一个tar归档文件
cat filename.tar | docker import - 镜像用户/镜像名:镜像版本号
:从tar包中的内容创建一个新的文件系统再导入为镜像
联合文件系统(UnionFS):
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual file system)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
Docker镜像加载原理:
为什么docker镜像要采用这种分层结构?
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如有多个镜像都从相同的base镜像构建而来,那么 Docker Host 只需再磁盘上保存一份 base 镜像,同时内存中也只需加载一份base镜像,就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
Docker镜像层都是只读的,容器层是可写的
当容器启动时,一个新的科协层被加载到镜像的顶部。这一层通常被称为“容器层”,“容器层”之下的都叫“镜像层”。
docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像,新镜像是从base镜像一层一层叠加生成的,每安装一个软件,就在现有镜像的基础上增加一层
案例演示ubuntu安装vim,并打包成一个新的镜像
bash# 首先要先进入到容器里,之后再执行命令
# 更新软件包列表
apt-get update
# 安装vim
apt-get install -y vim
# 退出容器,打包成一个新的镜像
docker commit -m="vim cmd add ok" -a="jerry" ee7cba59b288 myubuntu:1.1
# 查看本地已有的镜像,就能看到自己刚才打包的镜像了
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu 1.3 473a89ae6bfb 6 seconds ago 187MB
ubuntu latest 35a88802559d 4 weeks ago 78.1MB
拉取 registry 镜像: docker pull registry
运行私有库registry,相当于本地有个私有 Docker Hub:docker run -d -p 5000:5000 -v /data/myreqistry/:/var/lib/registry --privileged=true registry
演示创建一个新镜像,ubuntu安装ifconfig命令
bash# 创建一个新镜像
docker commit -m="ifconfig cmd add ok" -a="jerry" 4f2057334c76 myubuntu1:1.2
curl验证私服库上有什么镜像
bashcurl -XGET http://192.168.30.100:5000/v2/_catalog
# 返回结果没有镜像
{"repositories":[]}
将新镜像myubuntu1:1.2
修改符合私服规范的Tag
bashdocker tag myubuntu1:1.2 192.168.30.100:5000/myubuntu1:1.2
docker默认不允许http方式推送镜像,修改配置文件使之支持http,修改完配置如果不生效,就重启docker。
bashvim /etc/docker/daemon.json
# 把本机的请求ip和端口添加到这个配置文件
{
"insecure-registries": ["192.168.30.100:5000"]
}
# 重启docker
systemctl restart docker
push推送到私服库:docker push 192.168.30.100:5000/myubuntu1:1.2
再次curl验证私服库镜像
bashcurl -XGET http://192.168.30.100:5000/v2/_catalog
# 返回结果有一个myubuntu1镜像了
{"repositories":["myubuntu1"]}
pull到本地运行:docker pull 192.168.30.100:5000/myubuntu1:1.2
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性: 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
语法格式:docker run -it --privileged=true -v /宿主机绝对目录:/容器内绝对目录:ro 镜像名
示例:docker run -it -v /data/host_data/:/tmp/docker_data --privileged=true --name=u1 ubuntu
参数解释:
Docker挂载主机目录访问如果出现cannot open directory.:Permission denied 解决办法:在挂载目录后多加一个-privileged=true参数即可
默认挂载默认是可以读写的,也可以在容器目录后面加上rw,docker run -it -v /data/host_data/:/tmp/docker_data:rw --privileged=true --name=U1 ubuntu
如果需要容器内的挂在目录设置只读权限,可以在容器内目录加上ro 参数
语法格式:docker run -it --privileged=true -v /宿主机绝对目录:/容器内绝对目录:ro 镜像名
容器1完成和宿主机的映射
容器2继承容器1的卷规则:docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
示例:
bash# 先挂在容器1
docker run -it -v /data/host_data/:/tmp/docker_data -me=U1 ubuntu
# 容器2继承容器1
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
如果u1容器挂掉,也不会影响u2的数据卷挂在
总体步骤:
docker search tomcat
docker pull tomcat
docker images tomcat
docker run -d -p 8080:8080 --name t1 tomcat
docker stop t1
docker rm t1
最新版本 tomcat 需要把 webapps.dist 替换成 webapps,访问地址时才能看到tomcat页面,否则访问会显示404。或者可以直接安装旧版本:docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
我们可以直接运行下面的命令,默认会查看本地是否有镜像,没有就去仓库拉取镜像:
bashdocker run -d -p 3306:3306 --privileged=true -v /data/mysql/log:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
安装完成后,可以在宿主机进入 /data/mysql/conf
目录编辑配置文件。
bashvim my.cnf [client] default_character_set=utf8 [mysqld] collation_server=utf8_general_ci character_set_server=utf8
安装命令redis-server /etc/redis/redis.conf
这个是指定配置文件,点击 redis 可以在官网下载redis.conf配置文件,配置文件要和redis版本对应,否则可能会启动失败:
bashdocker run -p 6379:6379 --name myredis --privileged=true -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf
安装完成后修改 redis 配置文件
bind 127.0.0.1 # 注释掉这部分,使redis可以外部访问
daemonize yes # 把这个注释掉或者原来的yes改成no,该配置会与 docker run 中的 -d 参数冲突,会导致容器启动失败
requirepass password # 给redis设置密码
appendonly no # redis持久化,可以改成yes
本文作者:柯南
本文链接:
版权声明:©2024 柯南 All rights reserved.