sudo subscription-manager register
根据提示,输入username和password,这是在redhat网站上注册的用户名和密码。
sudo yum update
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
/var/lib/docker/
里的数据。注:本例中,之前没有安装过docker,也并没有 /var/lib/docker/
目录。
yum-utils
:sudo yum install -y yum-utils
docker-ce
repo:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[ding@192 ~]$ sudo yum repolist
Updating Subscription Management repositories.
repo id repo name
docker-ce-stable Docker CE Stable - x86_64
rhel-9-for-x86_64-appstream-rpms Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs)
rhel-9-for-x86_64-baseos-rpms Red Hat Enterprise Linux 9 for x86_64 - BaseOS (RPMs)
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker.service
[ding@192 ~]$ sudo docker version
Client: Docker Engine - Community
Version: 24.0.7
API version: 1.43
Go version: go1.20.10
Git commit: afdd53b
Built: Thu Oct 26 09:09:13 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:07:45 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.26
GitCommit: 3dd1e886e55dd695541fdcd67420c2888645a495
runc:
Version: 1.1.10
GitCommit: v1.1.10-0-g18a0cb0
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[ding@192 ~]$ docker compose version
Docker Compose version v2.21.0
sudo groupadd docker
注:本例中,提示“groupadd: group ‘docker’ already exists”。
sudo usermod -aG docker $USER
重新打开命令行窗口。(注:本例中使用的是虚拟机,则需要重启虚拟机)
验证:
[ding@192 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[ding@192 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:ac69084025c660510933cca701f615283cdbb3aa0963188770b54c31c8962493
Status: Downloaded newer image for hello-world:latest
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/
[ding@192 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
并没有任何进程,这是因为helloworld进程已经结束了。
[ding@192 ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b8bee697866 hello-world "/hello" About a minute ago Exited (0) About a minute ago recursing_sutherland
docker rm 6b8bee697866
[ding@192 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 7 months ago 13.3kB
docker rmi hello-world
[ding@192 ~]$ docker search welcome-to-docker
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker/welcome-to-docker Docker image for new users getting started w… 16
......
welcome-to-docker
:docker run -p 8080:80 docker/welcome-to-docker
打开浏览器,访问 http://localhost:8080
,如下:
按下“Ctrl + C”停止进程,或者在另一个终端窗口用 docker stop xxx
命令停止进程。最后用 docker rm
和 docker rmi
清理容器和镜像。
新建目录 welcome-to-docker
。
在该目录下,运行:
wget https://github.com/docker/welcome-to-docker/archive/refs/heads/main.zip
解压:
unzip main.zip
进入 welcome-to-docker-main
目录,查看内容:
[ding@192 welcome-to-docker-main]$ ls
Dockerfile MAINTAINERS.md package.json package-lock.json public README.md src
其中,最重要的就是 Dockerfile
。
使用 docker build
命令构建image:
docker build -t welcome-to-docker .
在下面这一步会卡住:
=> [6/6] RUN npm install && npm install -g serve && npm run build && rm -fr node_modules
我等了半小时,还一直hang着,只好Ctrl + C了。
这应该是因为npm的server连不上。
打开 Dockerfile
文件,对应的代码为:
# Install node packages, install serve, build the app, and remove dependencies at the end
RUN npm install \
&& npm install -g serve \
&& npm run build \
&& rm -fr node_modules
解决办法为,设置国内镜像: npm config set registry=https://registry.npmmirror.com
# Install node packages, install serve, build the app, and remove dependencies at the end
RUN npm config set registry=https://registry.npmmirror.com \
&& npm install \
&& npm install -g serve \
&& npm run build \
&& rm -fr node_modules
保存修改,再次build:
docker build -t welcome-to-docker .
这次等了大约一分钟就完成了。
查看image:
[ding@192 welcome-to-docker-main]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
welcome-to-docker latest 4ee26f3f44fc 25 seconds ago 190MB
运行 welcome-to-docker
:
docker run -p 8080:3000 welcome-to-docker
打开浏览器,访问 http://localhost:8080
,可以成功访问页面。
注: Dockerfile
文件里是 EXPOSE 3000
,所以使用 -p 8080:3000
。
新建目录 multi-container
。
在该目录下,运行:
wget https://github.com/docker/multi-container-app/archive/refs/heads/main.zip
解压:
unzip main.zip
进入 multi-container-app-main
目录,查看内容:
[ding@192 multi-container-app-main]$ ls
app compose.yaml README.md
运行 docker compose up -d
:
[ding@192 multi-container-app-main]$ docker compose up -d
validating /home/ding/Downloads/docker/multi-container/multi-container-app-main/compose.yaml: services.todo-app Additional property develop is not allowed
报错说: services.todo-app Additional property develop is not allowed
。我测试了一下,是因为compose的版本太低:
[ding@192 multi-container-app-main]$ docker compose version
Docker Compose version v2.21.0
需要将其升级到 v2.23.3
。方法为:
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
注: :-
表示设置缺省值。所以这句话意思是,如果没有设置变量 DOCKER_CONFIG
,就将其设置为 $HOME/.docker
,本例中为 /home/ding/.docker
。
创建 cli-plugins
目录:
mkdir -p $DOCKER_CONFIG/cli-plugins
下载 docker-compose
:
curl -SL https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
注:本例中,指定了版本 v2.23.3
。可以到 https://github.com/docker/compose/releases
去看一下当前的最新版本是什么。
添加可运行属性:
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
再次查看compose版本:
[ding@192 ~]$ docker compose version
Docker Compose version v2.23.3
可见,已经升级到 v2.23.3
了。
不过,只有当前用户使用的是 v2.23.3
版本,其他用户比如root,使用的仍然是 v2.21.0
版本。所以,最好将其放置于 /usr/local/lib/docker/cli-plugins/
目录下(如果没有该目录则用root权限创建),则所有用户都使用该版本。
现在,再次运行 docker compose up -d
,这次成功了。
查看docker容器:
[ding@192 multi-container-app-main]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c881e67bef98 multi-container-app-main-todo-app "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:35729->35729/tcp, :::35729->35729/tcp multi-container-app-main-todo-app-1
68596e594af8 mongo:6 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp multi-container-app-main-todo-database-1
打开浏览器,访问 http://localhost:3000
,如下:
添加几个task,如下:
新开一个浏览器窗口,也可以看到这些task。
如果不删除容器( docker rm
),仅仅 docker stop
后再重新启动容器,数据也还在。
但是,这些数据没有持久化。如果删除容器,然后再启动新的容器,数据就没了。
接着上面的例子。停止所有容器并删除容器。
编辑 compose.yaml
文件:
services:
todo-app:
build:
context: ./app
depends_on:
- todo-database
environment:
NODE_ENV: production
ports:
- 3000:3000
- 35729:35729
develop:
watch:
- path: ./app/package.json
action: rebuild
- path: ./app
target: /usr/src/app
action: sync
todo-database:
image: mongo:6
#volumes:
# - database:/data/db # 把database volume mount到 /data/db
ports:
- 27017:27017
#volumes:
#database: # 定义名为database的volume
有几行被注释掉了,将其反注释一下,保存。
运行容器:
[ding@192 multi-container-app-main]$ docker compose up -d
[+] Running 3/3
✔ Volume "multi-container-app-main_database" Created 0.0s
✔ Container multi-container-app-main-todo-database-1 Started 0.0s
✔ Container multi-container-app-main-todo-app-1 Started
注:可以看到输出结果里有一行是关于创建volume的。不过创建volume是一次性的,所以这一行输出结果只在第一次运行时有,后面再次运行时就没了。
打开浏览器,访问 http://localhost:3000
,输入一些task数据,然后停止容器,删除容器,重新运行容器,再次访问 http://localhost:3000
,可以看到task数据还在,说明数据被持久化了。
可用 docker volume ls
查看volume:
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
local multi-container-app-main_database
然后用 docker volume inspect
命令查看某个volume:
[root@192 ~]# docker volume inspect multi-container-app-main_database
[
{
"CreatedAt": "2023-12-26T08:18:16+08:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "multi-container-app-main",
"com.docker.compose.version": "2.23.3",
"com.docker.compose.volume": "database"
},
"Mountpoint": "/var/lib/docker/volumes/multi-container-app-main_database/_data",
"Name": "multi-container-app-main_database",
"Options": null,
"Scope": "local"
}
]
可见挂载点为 /var/lib/docker/volumes/multi-container-app-main_database/_data
。
可以看一下里面的内容:
[root@192 ~]# ls /var/lib/docker/volumes/multi-container-app-main_database/_data
collection-0--6348594005971772566.wt collection-7--6348594005971772566.wt index-3--6348594005971772566.wt index-8--6348594005971772566.wt mongod.lock WiredTiger WiredTiger.turtle
collection-2--6348594005971772566.wt diagnostic.data index-5--6348594005971772566.wt journal sizeStorer.wt WiredTigerHS.wt WiredTiger.wt
collection-4--6348594005971772566.wt index-1--6348594005971772566.wt index-6--6348594005971772566.wt _mdb_catalog.wt storage.bson WiredTiger.lock
这和进入mongo容器里( docker exec -it xxx sh
),然后 ls /data/db
看到的内容是一致的。
https://docs.docker.com/engine/install/centos/
https://docs.docker.com/compose/install/
https://docs.docker.com/storage/volumes/