确保应用能够在这些环境中运行和通过质量检测.并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复.
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
一次构建、随处运行
更快速的应用交付和部署:
传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。
更便捷的升级和扩缩容:
随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。
更简单的系统运维:
应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。
更高效的计算资源利用:
Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。
docker官网:http://www.docker.com
Docker Hub官网: https://hub.docker.com/
image 文件生成的容器实例,本身也是一个文件,称为镜像文件.
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
| Docker | 面向对象 |
|---|---|
| 容器 | 对象 |
| 镜像 | 类 |
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器.
仓库(Repository)是集中存放镜像文件的场所。
类似于Maven仓库,存放各种jar包的地方;github仓库,存放各种git项目的地方;Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
镜像文件 image 文件生成的容器实例,本身也是一个文件,称为镜像文件.
Docker 是一个Client-Server 结构的系统架构,Docker 守护进程运行在主机上,然后通过 Socker 连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器,容器,是一个运行时环境,就是一个个集装箱.
Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。
确认虚拟机版本是 CentOS7 及以上版本
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -r
3.10.0-1160.59.1.el7.x86_64
卸载旧版
yum list installed | grep docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装 gcc 相关
[root@localhost ~]# yum -y install gcc
[root@localhost ~]# yum -y install gcc-c++
设置存储库
官网推荐的是外网的地址,下载速度慢且会出现网络超时的问题.
[root@localhost ~]# yum install -y yum-utils
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
建立元数据缓存
[root@localhost ~]# yum makecache fast
安装 Docker
[root@localhost ~]# yum install docker-ce docker-ce-cli containerd.io
启动 Docker
[root@localhost ~]# systemctl start docker
运行 hello-world
[root@localhost ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["自己的阿里云镜像加速地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker images
-a:列出本地所有的镜像(含历史映像层)
-q:只显示镜像ID
[root@VM-0-12-centos docker]# docker images
镜像仓库源 镜像的标签版本号 镜像ID 镜像创建时间 镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 9 months ago 13.3kB
同一仓库源可以有多个 TAG 版本,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像.
[root@VM-0-12-centos docker]# docker images -q
feb5d9fea6a5
docker search 某个XXX镜像名字
--limit : 只列出N个镜像,默认25个
[root@VM-0-12-centos docker]# docker search --limit 5 redis
镜像名称 镜像说明 点赞数 是否官方 是否是自动构建的
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 11064 [OK]
bitnami/redis Bitnami Redis Docker Image 223 [OK]
bitnami/redis-sentinel Bitnami Docker Image for Redis Sentinel 38 [OK]
circleci/redis CircleCI images for Redis 14 [OK]
bitnami/redis-exporter
docker pull 镜像名字[:TAG] 没有 TAG 就是最新版
[root@VM-0-12-centos docker]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 1 13.26kB 0B (0%)
Containers 1 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
删除一个镜像
-f: 强制删除镜像
[root@VM-0-12-centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 9 months ago 13.3kB
[root@VM-0-12-centos docker]# docker rmi feb5d9fea6a5
Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 17d8a49cb33f
[root@VM-0-12-centos docker]# docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
docker run [OPTIONS] IMAGE [COMMAND] [ARG......]
docker run --name mysql --memory=512m --restart=always -v /usr/local/docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 33016:3306 -d mysql:5.7.38
--name="容器新名字" 为容器指定一个名称;
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:已交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端, 通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P:随机端口映射,大写P
-p:指定端口映射,小写p
| 参数 | 说明 |
|---|---|
| -p hostPost:containerPort | 端口映射 -p 8080:80 |
| -p ip:hostPost:containerPort | 配置监听地址 -p 10.0.0.1:8080:80 |
| -p ip::containerPort | 随机分配端口 -p 10.0.0.100::80 |
| -p hostPost:containerPort:udp | 指定协议 -p 8080:80:tcp |
| -p 81:80 -p 443:443 | 指定多个 |
[root@VM-0-12-centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ba6acccedd29 8 months ago 72.8MB
[root@VM-0-12-centos docker]# docker run -it ubuntu bash
root@d40983ae61dd:/#
docker ps [OPTIONS]
[root@VM-0-12-centos /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00d1b3d76fee ubuntu "bash" 18 seconds ago Up 18 seconds competent_torvalds
run 进去容器,exit 退出,容器停止
run进去容器,
docker start 容器ID或者容器名
docker restart 容器ID或者容器名
docker stop 容器ID或者容器名
docker kill 容器ID或容器名
docker rm 容器ID
docker rm -f $(docker ps -a -q)
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。
docker run -d 容器名
[root@VM-0-12-centos /]# docker run -d redis
07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9
[root@VM-0-12-centos /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07ded90b56af redis "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 6379/tcp intelligent_meninsky
00d1b3d76fee ubuntu "bash" 3 hours ago Up 3 hours competent_torvalds
docker logs 容器ID
[root@VM-0-12-centos /]# docker logs 07ded90b56af
1:C 23 Jun 2022 09:05:40.303 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 23 Jun 2022 09:05:40.303 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 23 Jun 2022 09:05:40.303 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 23 Jun 2022 09:05:40.304 * monotonic clock: POSIX clock_gettime
1:M 23 Jun 2022 09:05:40.304 * Running mode=standalone, port=6379.
1:M 23 Jun 2022 09:05:40.304 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 23 Jun 2022 09:05:40.304 # Server initialized
1:M 23 Jun 2022 09:05:40.304 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1'to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 23 Jun 2022 09:05:40.304 * Ready to accept connections
docker top 容器ID
[root@VM-0-12-centos /]# docker top 07ded90b56af
UID PID PPID C STIME TTY TIME CMD
polkitd 31140 31120 0 17:05 ? 00:00:00 redis-server *:6379
docker inspect 容器ID
[root@VM-0-12-centos /]# docker inspect 07ded90b56af
[
{
"Id": "07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9",
"Created": "2022-06-23T09:05:40.024477806Z",
"Path": "docker-entrypoint.sh",
"Args": [
"redis-server"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 31140,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-06-23T09:05:40.289655512Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
"ResolvConfPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/hostname",
"HostsPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/hosts",
"LogPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9-json.log",
"Name": "/intelligent_meninsky",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"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,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255-init/diff:/var/lib/docker/overlay2/05a8a4f1851e58cedf41a415398bb5cf39a32e326456951e6cc8d4a673e73e05/diff:/var/lib/docker/overlay2/8469b8e50c809cf1dc6f9c63ffc1fc5dc128cd73c1f92aa41187ee93f8a3be67/diff:/var/lib/docker/overlay2/193be01a8240889e740be1723fa5888ecc59bc6587ccb98306549947ed8c6c40/diff:/var/lib/docker/overlay2/aeaecb8e4ce8a77e4f47b62510351e91a5219593f40937aa764fa09f339ee4f5/diff:/var/lib/docker/overlay2/c269d2f03c12c5ec91a847865cead78e8b5effed0e77b9ef40085275f2e77853/diff:/var/lib/docker/overlay2/3160e9a44ba0655bee0354c0c2b4c5c11fa43aff0f3a0ace5be92a0188bdcfb0/diff",
"MergedDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/merged",
"UpperDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/diff",
"WorkDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "volume",
"Name": "554b0c5f868d14bab3cede05faf0415b8f7edccf94ea9bc7084bb3fb2bca8133",
"Source": "/var/lib/docker/volumes/554b0c5f868d14bab3cede05faf0415b8f7edccf94ea9bc7084bb3fb2bca8133/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "07ded90b56af",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.6",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
"REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
],
"Cmd": [
"redis-server"
],
"Image": "redis",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "f57ab2e208029d1363f4a8d556a2839d0b7c4bfd055b953fb989e4adf499cb52",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"6379/tcp": null
},
"SandboxKey": "/var/run/docker/netns/f57ab2e20802",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "ab2ae64ddea6caaaa0654f7afacd644848e5f555d51d0e3ba23d5070e5cd6cbd",
"Gateway": "172.18.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.18.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:12:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "359b060a5722ca714f272fee7ec1b866f2f20ba1f27a244d393046c7cb19d10d",
"EndpointID": "ab2ae64ddea6caaaa0654f7afacd644848e5f555d51d0e3ba23d5070e5cd6cbd",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:03",
"DriverOpts": null
}
}
}
}
]
docker exec -it 容器ID bashShell
docker attach 容器ID
docker cp 容器ID:容器内路径 目的主机路径
[root@VM-0-12-centos docker]# ll
total 0
[root@VM-0-12-centos docker]# pwd
/usr/local/docker
[root@VM-0-12-centos docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07ded90b56af redis "docker-entrypoint.s…" 35 minutes ago Up 35 minutes 6379/tcp intelligent_meninsky
00d1b3d76fee ubuntu "bash" 3 hours ago Up 3 hours competent_torvalds
[root@VM-0-12-centos docker]# docker cp 00d1b3d76fee:/tmp/a.txt /usr/local/docker/
[root@VM-0-12-centos docker]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 23 17:40 a.txt
export 导出容器的内容留作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
[root@VM-0-12-centos docker]# docker export 00d1b3d76fee > export.tar
[root@VM-0-12-centos docker]# ll
total 73400
-rw-r--r-- 1 root root 0 Jun 23 17:40 a.txt
-rw-r--r-- 1 root root 75159040 Jun 23 17:45 export.tar
[root@VM-0-12-centos docker]# cat export.tar | docker import - test/ubuntu:1.0
sha256:6b48c540913df35a1daccfcdc14b56a04edc96f8ec5a0f84c8b6f48bcbb2b474
[root@VM-0-12-centos docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu 1.0 6b48c540913d 16 seconds ago 72.8MB
redis latest 7614ae9453d1 6 months ago 113MB
ubuntu latest ba6acccedd29 8 months ago 72.8MB
[root@VM-0-12-centos docker]# docker run -it 6b48c540913d bash
root@ee539a48a5c6:/# cd /tmp/
root@ee539a48a5c6:/tmp# ll
total 8
drwxrwxrwt 2 root root 4096 Jun 23 09:40 ./
drwxr-xr-x 1 root root 4096 Jun 23 09:52 ../
-rw-r--r-- 1 root root 0 Jun 23 09:40 a.txt
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载.
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??
对于一个精简的 OS, rootfs 可以很小, 只需要包括最基本的命令, 工具和程序库就可以了, 因为底层直接用 Host 的 kernel, 自己只需要提供 rootfs 就行了,.由此可见对于不同的 linux 发行版, bootfs 基本是一致的, rootfs 会有差别, 因此不同的发行版可以公用 bootfs.,
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
Docker 镜像层都是只读的, 容器层是可写的.
当容器启动时, 一个新的可写层被加载到镜像的顶部. 这一层通常被称作 "容器层", "容器层" 之下都叫 "镜像层".
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

docker commit 提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
root@ee539a48a5c6:/# vim a.txt
bash: vim: command not found
root@ee539a48a5c6:/tmp# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [881 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:7 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [27.5 kB]
Get:8 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1331 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:10 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1979 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:12 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1411 kB]
Get:14 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2420 kB]
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1161 kB]
Get:16 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [30.3 kB]
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [54.2 kB]
Get:18 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [27.1 kB]
Fetched 22.8 MB in 10s (2345 kB/s)
Reading package lists... Done
root@ee539a48a5c6:/tmp# apt-get -y install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
......
update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/vim.1.gz (of link group editor) doesn't exist
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
[root@VM-0-12-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu 1.0 6b48c540913d 20 hours ago 72.8MB
redis latest 7614ae9453d1 6 months ago 113MB
ubuntu latest ba6acccedd29 8 months ago 72.8MB
[root@VM-0-12-centos /]# docker commit -m="add vim cmd" -a="zzyy" ee539a48a5c6 test/myubuntu:1.1
sha256:051bc4b8a6dc20c72f1224f077bdd3888b0ca725bebc26d9e6e5623a6cbadb6a
[root@VM-0-12-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/myubuntu 1.1 051bc4b8a6dc 15 seconds ago 178MB
test/ubuntu 1.0 6b48c540913d 20 hours ago 72.8MB
redis latest 7614ae9453d1 6 months ago 113MB
ubuntu latest ba6acccedd29 8 months ago 72.8MB
镜像中多了一个 test/myubuntu 的镜像, 其大小有 178MB.
启动新建的镜像后,其中自带了vim的功能.
https://cr.console.aliyun.com/repository/cn-hangzhou/learn_docker_images/docker_images/details
$ docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
$ docker pull registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]
$ docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]$ docker push registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
[root@VM-0-12-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/myubuntu 1.1 051bc4b8a6dc 15 seconds ago 178MB
test/ubuntu 1.0 6b48c540913d 20 hours ago 72.8MB
redis latest 7614ae9453d1 6 months ago 113MB
ubuntu latest ba6acccedd29 8 months ago 72.8MB
[root@VM-0-12-centos /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/myubuntu 1.1 051bc4b8a6dc 36 minutes ago 178MB
test/ubuntu 1.0 6b48c540913d 21 hours ago 72.8MB
redis latest 7614ae9453d1 6 months ago 113MB
ubuntu latest ba6acccedd29 8 months ago 72.8MB
[root@VM-0-12-centos /]# docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@VM-0-12-centos /]# docker tag 051bc4b8a6dc registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:1.1
[root@VM-0-12-centos /]#
[root@VM-0-12-centos /]#
[root@VM-0-12-centos /]# docker push registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:1.1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images]
18ff89b424df: Pushing [==============> ] 29.42MB/104.8MB
3414f251cfcb: Pushing [========> ] 12.48MB/72.78MB
18ff89b424df: Pushed
3414f251cfcb: Pushed
1.1: digest: sha256:1a62548283122eadf1fc312195f0fd564b1dc549521dd8d8e4e880090abd1858 size: 741
大致流程和发布到阿里云类似.
Docker Registry
官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库;
docker pull registry
运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry 默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调;
curl -XGET http://192.168.111.162:5000/v2/_catalog
[root@VM-0-12-centos docker]# curl -XGET http://localhost:5000/v2/_catalog
{"repositories":["test/myubuntu"]}
公式: docker tag 镜像:Tag Host:Port/Repository:Tag
docker tag test/myubuntu:1.2 localhost:5000/test/myubuntu:1.2
[root@VM-0-12-centos docker]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://8p4po18u.mirror.aliyuncs.com"],
"insecure-registries": ["localhost:5000"]
}
docker push localhost:5000/test/myubuntu:1.2
a8bb6d556bb6: Pushed
9f54eef41275: Pushed
1.2: digest: sha256:fea65b4a65b5e2a7a8c070232f2aed54f76332943c9288d273e7f65f1a3a8d7b size: 741
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
--privileged=true: 如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷.将 Docker 容器内的数据保存进宿主机的磁盘中.
将运用于运行的环境打包镜像, run 后形成容器实例运行, 但是我么对数据的要求希望是持久化的.
Docker 容器产生的数据, 如果不备份, 那么当容器实例删除后, 容器内的数据自然也就没有了, 为了能保存数据在 Docker 中我们使用卷.
[root@VM-0-12-centos ~]# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
root@7a46ffc0299f:/# cd /tmp/docker_data/
root@7a46ffc0299f:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:25 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:25 ../
root@7a46ffc0299f:/tmp/docker_data# touch dockerin.txt
root@7a46ffc0299f:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:26 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:25 ../
-rw-r--r-- 1 root root 0 Jun 24 14:26 dockerin.txt
root@7a46ffc0299f:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:26 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:25 ../
-rw-r--r-- 1 root root 0 Jun 24 14:26 dockerin.txt
-rw-r--r-- 1 root root 0 Jun 24 14:26 hostin.txt
[root@VM-0-12-centos ~]# cd "/tmp/docker_data"
-bash: cd: /tmp/docker_data: No such file or directory
[root@VM-0-12-centos ~]# cd /tmp/host_data/
[root@VM-0-12-centos host_data]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 24 22:26 dockerin.txt
[root@VM-0-12-centos host_data]# touch hostin.txt
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
默认就是读写
容器实例内部被限制,只能读取不能写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
容器1完成和宿主机的映射
[root@VM-0-12-centos ~]# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
root@7a46ffc0299f:/# cd /tmp/docker_data/
容器2继承容器1的卷规则
[root@VM-0-12-centos host_data]# docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
root@5f7b57866841:/# cd /tmp/docker_data/
root@5f7b57866841:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:26 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:48 ../
-rw-r--r-- 1 root root 0 Jun 24 14:26 dockerin.txt
-rw-r--r-- 1 root root 0 Jun 24 14:26 hostin.txt
root@5f7b57866841:/tmp/docker_data#
继承父容器后相当于也是直接挂载了对应的宿主机的路径,会直接同步对应的数据.
且父容器挂掉后还是可以继续同步,互不干扰.
[root@VM-0-12-centos ~]# docker search --limit 5 tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 3344 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 97 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 45 [OK]
secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0 [OK]
semoss/docker-tomcat Tomcat, Java, Maven, and Git on top of debian 0 [OK]
不指定版本默认拉取最新一版.
[root@VM-0-12-centos ~]# docker pull tomcat
Using default tag: latest
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Extracting 82.44MB/203.1MB
77b694f83996: Download complete
0f611256ec3a: Download complete
4f25def12f23: Download complete
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@VM-0-12-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 6 months ago 680MB
[root@VM-0-12-centos ~]# docker run -it -p 8080:8080 tomcat
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
防火墙先得开放8080端口;
由于最新版的tomcat有两个文件夹,webapps.dist和webapps, webapps 里面是没有初始化页面的,需要将webapps删除后将webapps.dist 改名字为webapps.
[root@VM-0-12-centos ~]# docker exec -it 6c5834abd30e bash
root@6c5834abd30e:/usr/local/tomcat# ll
bash: ll: command not found
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt
root@6c5834abd30e:/usr/local/tomcat# ls -l
total 160
-rw-r--r-- 1 root root 18994 Dec 2 2021 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 2021 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Dec 2 2021 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 2021 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 2021 README.md
-rw-r--r-- 1 root root 6905 Dec 2 2021 RELEASE-NOTES
-rw-r--r-- 1 root root 16517 Dec 2 2021 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 2021 bin
drwxr-xr-x 1 root root 4096 Jun 25 02:42 conf
drwxr-xr-x 2 root root 4096 Dec 22 2021 lib
drwxrwxrwx 1 root root 4096 Jun 25 02:42 logs
drwxr-xr-x 2 root root 4096 Dec 22 2021 native-jni-lib
drwxrwxrwx 2 root root 4096 Dec 22 2021 temp
drwxr-xr-x 2 root root 4096 Dec 22 2021 webapps
drwxr-xr-x 7 root root 4096 Dec 2 2021 webapps.dist
drwxrwxrwx 2 root root 4096 Dec 2 2021 work
root@6c5834abd30e:/usr/local/tomcat# cd webapps.dist/
root@6c5834abd30e:/usr/local/tomcat/webapps.dist# ll
bash: ll: command not found
root@6c5834abd30e:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@6c5834abd30e:/usr/local/tomcat/webapps.dist# cd ..
root@6c5834abd30e:/usr/local/tomcat# ll
bash: ll: command not found
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt
root@6c5834abd30e:/usr/local/tomcat# cd webapps
root@6c5834abd30e:/usr/local/tomcat/webapps# ls
root@6c5834abd30e:/usr/local/tomcat/webapps# cd ..
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
root@6c5834abd30e:/usr/local/tomcat# rm -rf webapps
root@6c5834abd30e:/usr/local/tomcat# mv webapps.dist/ webapps
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt NOTICE RUNNING.txt lib temp
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib work
下载低版本的 tomcat,这样的话就不需要配置了.
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
[root@VM-0-12-centos ~]# docker search --limit 5 mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12769 [OK]
mariadb MariaDB Server is a high performing open sou… 4906 [OK]
percona Percona Server is a fork of the MySQL relati… 579 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 557 [OK]
circleci/mysql MySQL is a widely used, open-source relation… 26
[root@VM-0-12-centos ~]# docker pull mysql:5.7.38
[root@VM-0-12-centos ~]# docker images mysql:5.7.38
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.38 74a6a7ec181f 2 days ago 462MB
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
简单版存在的问题一个是 docker 上默认字符集编码隐患
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
第二个问题就是没有进行容器卷的绑定, 数据不能持久化, 容器一关闭后数据就消失了.
docker run -d -p 33026:3306 --privileged=true -v /usr/local/docker/myMysql/log:/var/log/mysql -v /usr/local/docker/myMysql/data:/var/lib/mysql -v /usr/local/docker/myMysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7.8
docker run -d -p 3306:3306 --privileged=true 指定端口和开启访问权限配置
-v /zzyyuse/mysql/log:/var/log/mysql 挂载docker 的 mysql 容器的日志文件
-v /zzyyuse/mysql/data:/var/lib/mysql 挂载 docker 的 mysql 容器的数据文件
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d 挂载 docker 的 mysql 容器的配置文件
-e MYSQL_ROOT_PASSWORD=123456 指定mysql的密码
--name mysql mysql:5.7
进入宿主机挂载的目录下创建mysql的配置文件:
[root@VM-0-12-centos conf]# pwd
/usr/local/docker/myMysql/conf
[root@VM-0-12-centos conf]# vim my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
进入容器中查看同步后的配置文件:
root@73af070ce4dc:/etc/mysql/conf.d# cd /etc/mysql/conf.d
root@73af070ce4dc:/etc/mysql/conf.d# cd /
root@73af070ce4dc:/# cd /etc/mysql/conf.d
root@73af070ce4dc:/etc/mysql/conf.d# ls
my.cnf
root@73af070ce4dc:/etc/mysql/conf.d# cat my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
更改完配置文件后重启mysql容器,再查看数据库的编码集,就已经全部更改为utf8了.
[root@VM-0-12-centos myMysql]# docker restart 73af070ce4dc
73af070ce4dc
[root@VM-0-12-centos myMysql]# docker exec -it 73af070ce4dc bash
root@73af070ce4dc:/# mysql -uroot -p
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec
查找和拉取与tomcat还有mysql是一样的.
docker pull redis:6.0.8
[root@VM-0-12-centos myMysql]# docker pull redis:6.0.8
6.0.8: Pulling from library/redis
bb79b6b2107f: Pull complete
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
3f806f5245c9: Pull complete
f8a4497572b2: Pull complete
eafe3b6b8d06: Pull complete
Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
Status: Downloaded newer image for redis:6.0.8
docker.io/library/redis:6.0.8
[root@VM-0-12-centos docker]# docker run -d -p 6379:6379 redis:6.0.8
需要将redis的配置文件准备到宿主机上,这样后续操作才可以更好进行.
docker run -p 6379:6379 --name redis --privileged=true -v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss
我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目
我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境 转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境 随着微服务化的进
1.现象服务重启后,通过dockerstart方式无法启动实例,报出错误:Errorresponsefromdaemon:errorcreatingoverlaymountto/var/lib/docker/overlay2/xxx/merged:nosuchfileordirectorydockersave导出镜像也报出2.网上各种尝试摸索无效果修改daemon.json中的storage-driver为overlay,重启无效果。禁用selinux,临时或永久方式都无效果。修改/etc/docker/daemon.json中的storage-driver为overlay2,无效果。修改/l
homeassistant久仰大名,据说可以一统各大物联网平台的设备,家里各平台的设备都有一点,控制起来很不方便,于是乎我也来尝尝~homeassistant官网https://www.home-assistant.io/HACShttps://github.com/hacs/integration准备1.Linux系统(Window)其实也类似2.安装好dockerdocker安装homeassistant官方有几个版本可供选择,安装方式可以:直接刷HA的系统,也可以用Docker安装,还可以直接安装在物理机上,具体区别如下:我采用的是Docker进行安装,也就是Container,从上图也
文章目录前言一、迁移步骤前言Docker安装的东西多了或者目录分配大小未提前规划好,就容易出现磁盘空间不足的问题,可以采用软链接的方式迁移数据目录空间。一、迁移步骤要使用软连接的方式修改Docker数据存储目录,需要执行以下步骤:1、使用systemctlstopdocker命令停止Docker服务;2、创建文件夹:mkdir/home/docker(/home/docker为新磁盘目录名);3、移动/var/lib/docker/目录到新目录中:mv/var/lib/docker/*/home/docker;4、使用rm-rf/var/lib/docker命令删除原有的Docker数据目录;
一、Docker介绍Docker中⽂社区⽂档:https://www.docker.org.cn/index.html Docker是⼀个开源的软件部署解决⽅案。 Docker也是轻量级的应⽤容器框架。 Docker可以打包、发布、运⾏任何的应⽤。 Docker就像⼀个盒⼦,⾥⾯可以装很多物件,如果需要某些物件,可以直接将该盒⼦拿⾛,⽽不需要从该盒⼦中⼀件⼀件的取。 Docker是⼀个客户端-服务端(C/S)架构程序。客户端只需要向服务端发出请求,服务端处理完请求后会返回结果。Docker包括三个基本概念:镜像(Image) Docker的镜像概念类似于虚拟机⾥的镜像,是⼀个只读的