做网站比较好的公司做外贸需要什么条件
系列文章目录
Docker 概述
 Docker getting started
文章目录
- 系列文章目录
 - 前言
 - 一、容器及镜像的概念
 - 二、容器化一个应用
 - 三、更新应用
 - 四、分享应用
 - 五、持久化数据存储
 - volume mount 和 bind mount比较
 - Container volumes
 - bind mounts
 
- 六、跨多容器的应用
 - 七、Docker 其它
 - 八、Docker 图形化界面显示
 - 总结
 
前言
本文主要包含以下内容:
- 将一个应用放在容器中运行
 - 介绍持久化数据存储方式
 - Docker图形化界面显示方法
 
一、容器及镜像的概念
容器:
- 镜像的可运行实例。通过Docker API or CLI可以创建、启动、停止、移动或删除容器。
 - 可在本地、虚拟机、云上运行。
 - 便捷(可在任意OS上运行)。
 - 与其他容器隔离,运行独立的软件、二进制文件、配置。
 
镜像:
 提供隔离的、定制化的文件系统,也包含配置信息、环境变量等。
二、容器化一个应用
git clone https://github.com/docker/getting-started.git
 
- 建立Dockerfile
用于指示Docker如何创建镜像 
Dockerfile
# syntax=docker/dockerfile:1FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
 
- 建立容器镜像
 
docker build -t getting-started .
 
docker build命令通过通过 Dockerfile 建立容器镜像。在此过程中Docker下载了许多“layer”。因为是从node:18-alpine开始的,又因本地中没有此镜像,需要先下载。
下载完成后,指令从Docker中拷贝到应用中,并通过yarn安装依赖。CMD指令指定从此镜像启动容器时要运行的默认命令。
最后-t表示给镜像打个标签,如getting-started
最后的.表示从当前目录找查Dockerfile文件
 
- 启动一个应用容器
 
docker run -dp 3000:3000 getting-started
 
-d detached模式
 -p在主机端口3000与容器端口3000之间创建端口映射,没有端口映射将无法访问应用
- 访问应用
 
http://localhost:3000
 
- 通过Docker Dashboard可查看运行中的容器
 
三、更新应用
上章容器化了一个todo应用。本章将更新应用和容器镜像。stop and remove容器。
- src/static/js/app.js 修改
 
...-                <p className="text-center">No items yet! Add one above!</p>+                <p className="text-center">You have no todo items yet! Add one above!</p>...
 
- docker build
 
docker build -t getting-started .
 
- 停止,移除容器
 
# 查看运行中的容器
docker ps
# 停止容器
docker stop <the-container-id>
# 移除容器
docker rm <the-container-id>
# 停止并移除容器
docker rm -f <the-container-id>
 
- start the updated app container
 
docker run -dp 3000:3000 getting-started
 
四、分享应用
# 登陆Docker Hub 
docker login -u YOUR-USER-NAME
# 添加tag
docker tag getting-started YOUR-USER-NAME/getting-started
# push
docker push YOUR-USER-NAME/getting-started
 
五、持久化数据存储
容器从镜像的“层”中获取该容器的文件系统,即便是从统一镜像实例的两个容器也是隔离的,两个容器之间的更改不互通。
# 运行容器,并执行命令 bash ......
docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
# 查看运行中的容器 -a 查看所有容器
docker ps
# 在容器中执行命令
docker exec <container-id> cat /data.txt
# 然后再run另一个容器,次容器中则无data.txt文件
 
volume mount 和 bind mount比较
| Named volumes | Bind mounts | |
|---|---|---|
| 共享文件存放在主机的位置 | 由Docker选择 | 用户决定 | 
mount示例 (using --mount) | type=volume,src=my-volume,target=/usr/local/data | type=bind,src=/path/to/data,target=/usr/local/data | 
| 用容器内容填充新卷 | Y | N | 
| 支持卷驱动程序 | Y | N | 
Container volumes
Volumes可将容器中的某一文件系统路经连接至本地主机上。如果在容器总挂载了该目录,其变更也在宿主机上可见。如果我们跨容器重新启动装载相同的目录,我们将看到相同的文件。
# create volume
docker volume create <filename>
# 在run一个镜像时加上volume,volume文件所在的目录就成了volume目录
docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
# rm上面的容器后再用相同的命令即可实现在多个容器中共享数据# docker volume <filename> 的存放位置
docker volume inspect todo-db
[{"CreatedAt": "2022-09-26T02:18:36Z","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/todo-db/_data","Name": "todo-db","Options": {},"Scope": "local"}
]
 
bind mounts
docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
 
src为host的目录,target为容器的目录
 运行此条命令后 host的"$(pwd)"目录和 容器的/src目录实时同步
在容器中运行宿主机中正在开发的应用
docker run -dp 3000:3000 \-w /app --mount type=bind,src="$(pwd)",target=/app \node:18-alpine \sh -c "yarn install && yarn run dev"
 
dp 3000:3000分离模式,指定host和容器的端口映射(用于访问app网页)-w /app设置命令行的工作目录--mount type=bind, src="$(pwd)", target=/appbind mount 宿主机目录(“$(pwd)”)和容器目录(/app)node:18-alpine使用的镜像sh -c "yarn install && yarn run dev"容器启动后运行的命令。使用sh(node:18-alpine没有bash) 运行 yarn install 安装包,然后运行 yarn run dev 启动 该软件。如果查看下 package.json,dev脚本启动了nodemon
docker logs -f <container-id>
nodemon src/index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000
 
六、跨多容器的应用
APP放在一个容器中,MySQL放在另一个容器中
 
 默认情况下容器与其它容器、进程是隔离的。多个容器之间可通过网络进行通讯,同一个网络下的容器才可进行通讯。
- 创建网络
 
docker network create <app name todo-app>
 
- 启动MySQL容器,并将其附着在网络上
 
docker run -d \--network todo-app --network-alias mysql \-v todo-mysql-data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \-e MYSQL_DATABASE=todos \mysql:8.0
 
- 验证2是否成功
 
docker exec -it <mysql-container-id> mysql -u root -p
 
mysql> SHOW DATABASES;
+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                || todos              |+--------------------+5 rows in set (0.00 sec)
mysql> exit
 
连接MySQL
- 启动一个新的容器,连接到同一个network
此处用到的image为 nicolaka/netshoot 
docker run -it --netword <netword-file> <imagename>dP            dP                           dP   88            88                           88   
88d888b. .d8888b. d8888P .d8888b. 88d888b. .d8888b. .d8888b. d8888P 
88'  `88 88ooood8   88   Y8ooooo. 88'  `88 88'  `88 88'  `88   88   
88    88 88.  ...   88         88 88    88 88.  .88 88.  .88   88   
dP    dP `88888P'   dP   `88888P' dP    dP `88888P' `88888P'   dP   Welcome to Netshoot! (github.com/nicolaka/netshoot) 
找到 hostname为 mysql的IP
dig mysql; <<>> DiG 9.18.11 <<>> mysql
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38459
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:
;mysql.				IN	A;; ANSWER SECTION:
mysql.			600	IN	A	172.18.0.2;; Query time: 3 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Tue Feb 14 13:52:52 UTC 2023
;; MSG SIZE  rcvd: 44 
其中mysql不仅仅是一个有效的hostname,Docker还会把他解析成IP地址,即--network-alias mysql与该IP有映射关系。
 也就是说应用只需要连接到hostname为 mysql 的容器即可实现容器间通讯。
- 将APP连接到MySQL
在/app目录下 
docker run -dp 3000:3000 \-w /app -v "$(pwd):/app" \--network todo-app \-e MYSQL_HOST=mysql \-e MYSQL_USER=root \-e MYSQL_PASSWORD=secret \-e MYSQL_DB=todos \node:18-alpine \sh -c "yarn install && yarn run dev"
 
查看进度
docker logs -f <container-id>
查看数据库
docker exec -it <mysql-container-id> mysql -p todosmysql> select * from todo_items;
+--------------------------------------+------+-----------+
| id                                   | name | completed |
+--------------------------------------+------+-----------+
| f207cb07-c947-4d37-aef0-4b0dc50044d5 | abc  |         0 |
| d1e7dc53-fb06-4001-96a5-a5dc142e90ba | dev  |         1 |
| 8279b8a3-383b-4be4-bd4b-002a1111b44e | sdf  |         0 |
+--------------------------------------+------+-----------+
3 rows in set (0.01 sec) 
七、Docker 其它
检查是否安装了Docker 组件
docker compose version
 
Docker 组件可帮助快速构建跨容器的应用,配置好后只需一条命令即可其多多容器应用。
其它:
# 扫描docker 镜像的漏洞
docker scan <image-name># 查看镜像的layers
docker image history <image-name># 通过Layer caching加速镜像的构建等
 
八、Docker 图形化界面显示
把docker镜像看做一台没配显示器的电脑,程序可以运行,但是没地方显示。
而linux目前的主流图像界面服务X11又支持客户端/服务端(Client/Server)的工作模式。
只要在容器启动的时候,将『unix:端口』或『主机名:端口』共享给docker,docker就可以通过端口找到显示输出的地方,和linux系统共用显示。
# 安装x11界面服务
apt-get install x11-xserver-utils
# 为所有用户开放权限
xhost +# 在启动容器
docker run -it \-v /tmp/.x11-unix:/tmp/.x11-unix \-e DISPLAY=unix$DISPLAY -e GDK_SCALE \-e GDK_DPI_SCALE --net=host ubuntu /bin/bash
 
然后安装个小程序测试是否成功
# apt-get update
apt-get install xarclock
xarclock
 
