Docker的一个简单例子(一)

文章目录

环境

  • RHEL 9.3
  • Docker Community 24.0.7

示例

准备

从github克隆 getting-started-app 项目:

powershell 复制代码
git clone https://github.com/docker/getting-started-app.git

查看项目:

powershell 复制代码
➜  getting-started-app git:(main) tree
.
├── package.json
├── README.md
├── spec
│   ├── persistence
│   │   └── sqlite.spec.js
│   └── routes
│       ├── addItem.spec.js
│       ├── deleteItem.spec.js
│       ├── getItems.spec.js
│       └── updateItem.spec.js
├── src
│   ├── index.js
│   ├── persistence
│   │   ├── index.js
│   │   ├── mysql.js
│   │   └── sqlite.js
│   ├── routes
│   │   ├── addItem.js
│   │   ├── deleteItem.js
│   │   ├── getItems.js
│   │   └── updateItem.js
│   └── static
│       ├── css
│       │   ├── bootstrap.min.css
│       │   ├── font-awesome
│       │   │   ├── all.min.css
│       │   │   ├── fa-brands-400.eot
│       │   │   ├── fa-brands-400.svg#fontawesome
│       │   │   ├── fa-brands-400.ttf
│       │   │   ├── fa-brands-400.woff
│       │   │   ├── fa-brands-400.woff2
│       │   │   ├── fa-regular-400.eot
│       │   │   ├── fa-regular-400.svg#fontawesome
│       │   │   ├── fa-regular-400.ttf
│       │   │   ├── fa-regular-400.woff
│       │   │   ├── fa-regular-400.woff2
│       │   │   ├── fa-solid-900.eot
│       │   │   ├── fa-solid-900.svg#fontawesome
│       │   │   ├── fa-solid-900.ttf
│       │   │   ├── fa-solid-900.woff
│       │   │   └── fa-solid-900.woff2
│       │   └── styles.css
│       ├── index.html
│       └── js
│           ├── app.js
│           ├── babel.min.js
│           ├── react-bootstrap.js
│           ├── react-dom.production.min.js
│           └── react.production.min.js
└── yarn.lock

10 directories, 40 files

构建

在项目根目录下,创建 Dockerfile 文件如下:

powershell 复制代码
# syntax=docker/dockerfile:1

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

其中:

  • # syntax=docker/dockerfile:1 :指定语法
  • FROM node:18-alpine :指定base image
  • WORKDIR /app :指定容器里的当前目录
  • COPY . . :从宿主机复制文件/目录到容器里
  • RUN yarn install --production :在容器里运行命令
  • CMD ["node", "src/index.js"] :在启动容器时,默认运行的命令,注意不是构建时运行
  • EXPOSE 3000 :开放端口

构建:

powershell 复制代码
docker build -t getting-started .

其中:

  • -t :给image添加名字和tag,其格式为 -t <name:tag> ,其中,tag是可选的,其默认值是 latest
  • .Dockerfile 的路径

查看image:

powershell 复制代码
➜  getting-started-app git:(main) ✗ docker images "get*"
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
getting-started   latest    a6895c5f1a96   28 minutes ago   223MB

启动/停止容器

powershell 复制代码
docker run -dp 127.0.0.1:3000:3000 getting-started
  • -d --detach :在后台运行容器
  • -p --publish :宿主机和容器之间的端口映射,格式为 <host>:<container>
    • host :宿主机地址
    • container :容器端口

查看容器:

powershell 复制代码
➜  getting-started-app git:(main) ✗ docker ps  
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                      NAMES
d893e30dba55   getting-started   "docker-entrypoint.s..."   36 minutes ago   Up 36 minutes   127.0.0.1:3000->3000/tcp   crazy_wiles

打开浏览器,访问 http://localhost:3000

注意:只能用 http://localhost:3000 或者 http://127.0.0.1:3000 访问,不能用IP地址 http://192.168.1.128:3000 访问,也不能在其它机器用 http://192.168.1.128:3000 访问,因为设置了只有网络回环有效。若想在别的机器也能访问,需要设置为 -p 0.0.0.0:3000:3000

添加一些item,如下:

停止容器:

powershell 复制代码
docker stop <container ID>

现在,用 docker ps 命令看不到该容器了,不过 docker ps -a 还能看到:

powershell 复制代码
➜  getting-started-app git:(main) ✗ docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS                          PORTS     NAMES
d893e30dba55   getting-started          "docker-entrypoint.s..."   46 minutes ago   Exited (0) About a minute ago             crazy_wiles
......

删除容器:

powershell 复制代码
docker rm <container ID>

现在用 docker ps -a 命令也看不到该容器了。

更新应用

假设现在源代码有了一些修改,比如打开 src/static/js/app.js 文件,找到下面这一行代码:

javascript 复制代码
                <p className="text-center">No items yet! Add one above!</p>

将其修改为:

javascript 复制代码
                <p className="text-center">You have no todo items yet! Add one above!</p>

保存退出,然后重新构建:

powershell 复制代码
docker build -t getting-started .

启动容器:

powershell 复制代码
docker run -dp 127.0.0.1:3000:3000 getting-started

注意:如果刚才的旧容器仍然在运行,则需要先把旧容器停止,否则这一步会失败,因为3000端口被占用了。

打开浏览器,访问 http://localhost:3000

可见,修改已经生效了。

分享应用

可以把构建好的image push到registry。

打开 http://hub.docker.com ,登录:

点击"Create repository"按钮:

在Repository Name处输入 getting-started ,然后点击"Create"按钮:

现在,repository就创建好了:

如图上所示,可用以下命令把本地image push到repository:

powershell 复制代码
docker tag <image>:<tag> <new-repo>:<tag>
docker push <new-repo>:<tag>

现在,我们来push一下试试。

首先要在命令行登录Docker Hub:

powershell 复制代码
docker login -u <ID>

按提示输入密码。

注:并没有指定registry,默认值就是Docker Hub。

查看本地image:

powershell 复制代码
➜  getting-started-app git:(main) ✗ docker images "get*"
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
getting-started   latest    a89b3880eee8   36 minutes ago   223MB

通过 docker tag 命令,打上正确的tag:

powershell 复制代码
docker tag getting-started <ID>/getting-started

注:没有指定tag,默认是 latest

然后再查看本地image:

powershell 复制代码
➜  getting-started-app git:(main) ✗ docker images         
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
kaiding1/getting-started   latest    a89b3880eee8   39 minutes ago      223MB
getting-started            latest    a89b3880eee8   39 minutes ago      223MB
......

现在,我们就可以push image了:

powershell 复制代码
docker push <ID>/getting-started

接下来,我们使用 Play with Docker 来测试一下刚刚push的image。

打开浏览器,访问 http://play-with-docker.com

点击"Login"按钮,选择"Docker",弹出登录页面,输入Docker Hub的用户名和密码。

进入主界面后,点击左边的"ADD NEW INSTANCE",在右边会出现一个终端。如下图所示:

在终端里,启动刚才push的image:

powershell 复制代码
docker run -dp 0.0.0.0:3000:3000 <ID>/getting-started

接下来,点击页面上的"OPEN PORT"按钮,输入"3000",或者直接点击页面上的"3000"链接,会打开一个新页面:

至此,我们在一个全新的环境上部署了刚刚push的image,测试其工作正常。

参考

  • https://docs.docker.com/get-started/
相关推荐
修己xj1 小时前
别再让Docker占满你的硬盘!一篇搞定docker system所有命令
docker
布吉岛的石头3 小时前
Docker Compose编排实战:多容器应用从开发到生产
运维·docker·容器
SPC的存折8 小时前
20、K8S-Pod驱逐
java·docker·kubernetes
皓月盈江11 小时前
Linux Ubuntu系统如何编辑Docker容器内的文件
linux·ubuntu·docker·容器·靶场·vulhub·编辑docker内文件
魔极客11 小时前
1panel面板安装ollama的详细过程
docker·1panel·ollama
椰汁菠萝12 小时前
[特殊字符] Nginx UI:Docker 部署与完全使用指南
nginx·ui·docker
csdn小瓯13 小时前
CI/CD流水线搭建:GitHub Actions + Docker + Railway自动化部署实战
ci/cd·docker·github
代码讲故事13 小时前
mac电脑上docker突然无法运行,不停的出现弹框,“com.docker.vmnetd”将对你的电脑造成伤害。附国内不同芯片高速下载地址,下载直接运行。
macos·docker·容器·arm·mac·intel·下载
皓月盈江14 小时前
Linux Ubuntu系统使用Docker搭建vulhub靶场环境
linux·ubuntu·docker·tomcat·vulhub·漏洞靶场
程序员老邢14 小时前
【技术底稿 36】Docker Compose 微服务迁移 K3s:离线导入、镜像挂载、Nginx 重定向全踩坑复盘
nginx·docker·云原生·k3s·微服务迁移·技术底稿·容器运维