Docker 使用简介
  xqA0sOKuvLcb 2023年11月22日 16 0

Docker 简介


Docker:海豚,身上背着一堆集装箱

场景:

传统的服务器 Docker 1G左右 几十兆几百兆 CentOS占CPU Docker CPU引擎占用低 1-2分钟 几秒 安装软件 安装方便 部署应用 部署应用,挂载,数据卷 多个应用放到一起 每个应用服务都是一个容器,相互隔离 一个独立的操作系统 必须依赖于操作系统,推荐使用Linux

Docker 安装

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 另一种方式 
curl -sSL https://get.daocloud.io/docker | sh
# 如上述两种方式都不行
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查看所有可安装版本
yum list docker-ce --showduplicates | sort -r
# 安装
yum install docker-ce-18.03.1.ce

# almalinux centos8
dnf clean all
dnf update
# 添加必要的Docker存储库
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# 找到Docker CE的可安装版本
dnf list docker-ce --showduplicates | sort -r
# 安装Docker CE
dnf install docker-ce-3:24.0.7-1.el9 -y
# 镜像源配置
vim /etc/docker/daemon.json

1、镜像:image。一个镜像代表一个软件。如:redis镜像,mysql镜像,tomcat镜像。。 特点:只读 2、容器:container。一个镜像只要一启动,称之为启动了一个容器。 3、仓库:repository。存储docker中的镜像具体位置 远程仓库:在全球范围内有一个远程仓库 本地仓库:当前自己机器中下载的镜像存储位置

Docker配置阿里云镜像加速 https://www.cnblogs.com/LUA123/p/11401962.html

Docker 使用

查看 Docker 信息

docker info

查看 Docker 镜像 image

docker images

查找镜像和下载

远程查找镜像

docker search ubuntu

查找容器的版本信息

在找到所需要的容器镜像的名称之后,通常需要进一步在docker的镜像源中查找该镜像的版本列表。由于docker本身没有直接提供查看版本的功能,因此在这里我们为大家提供了一个可以查看镜像版本的简单脚本docker-tags。我们生成docker-tags脚本并加入以下内容 ,

vim docker-tags
# 添加以下内容
curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$1/tags/?page=$2" |
sed -e 's/,/\n/g' -e 's/\[/\\\[\n/g' |
grep -E '"name":|"count":' |
sed -e 's/"//g' -e "s/name:/$1:/g" -e "s/{count:/$1总版本数-/"

docker-tags脚本编辑好之后,需要通过chmod修改文件权限才可以执行。在权限修改完成之后,就可以使用docker-tags脚本来查询相关镜像的最近版本信息了。

chmod 777 docker-tags 
./docker-tags ubuntu

Docker 镜像操作

安装镜像

MySQL 5.7

docker pull mysql:5.7

删除镜像

若已有镜像用于容器,请先将容器删除

docker rm -f <CONTAINER ID>
docker image rm <IMAGE ID>
docker rmi <IMAGE ID>
# 强制删除镜像(已经创建容器的镜像)
docker rmi --force <IAMGE ID>

查看镜像

docker inspect <IMAGE ID>

Docker 容器操作

运行容器

#	第一个8080是外部海豚上的 第二个8080是内部集装箱上的 
docker run -p 8080:8080

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器 ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -P: 随机端口映射,容器内部端口随机映射到主机的端口 -p: 指定端口映射,格式为:主机 (宿主) 端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="nginx-lb": 为容器指定一个名称; --dns 8.8.8.8: 指定容器使用的 DNS 服务器,默认和宿主一致; --dns-search example.com: 指定容器 DNS 搜索域名,默认和宿主一致; -h "mars": 指定容器的 hostname; -e username="ritchie": 设置环境变量; --env-file=[]: 从指定文件读入环境变量; --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定 CPU 运行; -m : 设置容器使用内存最大值; --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --link=[]: 添加链接到另一个容器; --expose=[]: 开放一个端口或一组端口; --volume , -v 绑定一个卷

启动容器

docker start <container id>

停止容器

docker stop <container id>

重启容器

docker restart <container id>

删除容器

docker rm <container id>

强制删除容器(正在运行的容器)

docker rm --force <container id>
# 或者
docker rm -f <container id>

查看容器

docker inspect <container id>

Docker 镜像保存和加载

本地保存

首先可以通过docker save命令可以将docker内部的一个或多个镜像导出成文件。下面的命令中先下载nginx,hello-world两个镜像,然后再将镜像导出到images.tar文件中。docker save的格式为:docker save -o [导出文件名] [需要导出的镜像列表]...

docker pull hello-world
docker pull nginx
docker save -o images.tar nginx hello-world 
ll images.tar

从本地加载镜像文件

接下来通过docker load命令将images.tar中的两个镜像导入回docker内部。即可实现在没有网络访问的情况更新镜像。docker load的格式为:docker load -i [导入文件名]。要注意的是:如果docker内部已经存在了相关的镜像,文件中的镜像会被忽略。

在镜像导入完毕之后,可以通过docker images进行验证。

docker load -i images.tar
docker images

Docker 容器快照的导出和导入

容器快照的导出

当容器文件修改之后,可以通过docker export命令将容器以快照的形式导出到文件。其命令的格式为docker export 容器名 > 快照文件名。和镜像导出不同,快照的导出,会将容器的镜像,和容器在镜像之上的修改部分同时导出

docker export python-1 > python-snapshot.tar
ll python-snapshot.tar

容器快照的导入

对于通过docker export导出的容器快照文件。可以通过docker import命令将其导入到docker中,在这里需要特别注意的是:docker import是以镜像而不是容器的形式导入快照。也就是说导入的快照并不能直接运行,而是需要根据此快照镜像再次创建容器才可以使用。docker import命令的格式为docker import 快照文件 导入镜像名称:版本号

docker import python-snapshot.tar python-snapshot:latest

Docker 容器与宿主机时间不同步

对于已创建的容器:

docker cp /usr/share/zoneinfo/Asia/Shanghai <containername>:/etc/localtime

创建容器前

docker run -d -p 8080:80 -v /etc/localtime:/etc/localtime -v /etc/timezone:/etc/timezone <containername>

修改运行中的 Docker 容器的端口映射和挂载目录

方法一:删除原有容器,重建新容器

参考以上移除容器,启动容器

方法二:修改配置文件,重启docker服务

容器配置文件路径:

/var/lib/docker/containers/[[hash_of_the_container]/hostconfig.json]

其中的hashofthecontainer是docker镜像的hash值,可以通过docker ps或者docker inspect containername查看。(CONTAINER ID就可以看出来)

可以到/var/lib/docker/containers目录下,ls -l

{"Binds":["/usr/docker/redis/redis-slave2.conf:/usr/local/etc/redis/redis.conf"],"ContainerIDFile":"","LogConfig":{"Type":"json-file","Config":{}},"NetworkMode":"default","PortBindings":{"6379/tcp":[{"HostIp":"","HostPort":"6381"}]},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"shareable","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DiskQuota":0,"KernelMemory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":null,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0}

重启docker服务,再启动容器服务就可以了。

systemctl restart docker
docker ps -a
docker start <container id>

Docker 动态修改 --restart 参数

--restart参数

  • no 不自动重启
  • on-failure:重启次数 指定自动重启的失败次数,到达失败次数后不再重启
  • always 自动重启

修改线上容器--restart参数值

docker update --restart=no [容器名] 
docker update --restart=always [容器名]
docker update --restart=on-failure:3 [容器名]

Docker 的镜像迁移到另一台服务器

# 找到想要移动的docker容器ID
dockerCONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
58ac9237b040        redis:4.0.11                 "docker-entrypoint.s…"   5 hours ago         Up 2 hours          0.0.0.0:6380->6379/tcp   redis-slave1
454bb484f90a        redis:4.0.11                 "docker-entrypoint.s…"   5 hours ago         Up 2 hours          0.0.0.0:6379->6379/tcp   redis-master
ps -a

# 提交变更,并且把容器保存成镜像,命名为redis-master
docker commit 454bb484f90a redis-master
# 把redis-master镜像保存成tar文件
docker save redis-master > /root/mysoftware/docker-file/redis/redis-master.tar
# 拷贝到新的机器,执行load命令
docker load < ./redis-master.tar

Docker中 <none>镜像的来历及快速删除操作

docker rmi -f $(docker images | grep "none" | awk '{print $3}')

来历:在docker反复build一个Dockerfile,并且使用相同tag(或者不用tag)会存留很多none镜像。第一次build生成一个image id, 再次build后,会重新生成一个image id, 命名和上一个一样,所以上一个镜像的tag和名字就会自动变成 <none>

实时查看日志

docker logs -f <CONTAINER ID>

解决Linux 下普通用户执行docker命令权限问题

sudo groupadd docker #添加用户组
sudo gpasswd -a username docker #将当前用户添加至用户组
newgrp docker #更新用户组
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月22日 0

暂无评论

推荐阅读
  xqA0sOKuvLcb   2023年11月22日   17   0   0 redisDockerredisdocker
  bifOjSxj34Bv   2023年12月07日   22   0   0 nginxDockerdockernginx
xqA0sOKuvLcb