1.创建dockerfile
这里面的东西是自己写的。
FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
WORKDIR /app:指定接下来的工作路径为/app。
RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
2.构建镜像image
根据Dockerfile,会在执行build命令时,自动依赖该Dockerfile来生成image,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。此时会有一大堆东西自动安装,很快。
$ docker image build -t feed_bert:v1 .
# 在本机看到这个 image 文件
$ docker image
3.创建容器container
运行feed_bert:v1 这个image 文件。会从 image 文件,生成一个容器实例。容器实例就是容器文件。-it参数:容器的 Shell 映射到当前的 Shell,然后在本机窗口输入的命令,就会传入容器。
$ sudo docker container run -it feed_bert_embedding:v1 /bin/bash
root@66d80f4aaf1e:/app#
feed_bert_embedding:v1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
# 在本机的另一个终端窗口 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
命令手动终止容器:
$ docker container kill [containID]
删除指定的容器文件(如果容器还在运行,则删不掉容器)
$ docker container rm [containerID]
也可以使用docker container run命令的--rm参数,在容器终止运行后自动删除容器文件。
run后面的--name用来控制启动后,进程的名字,如果不传入这个参数,则会随机生成一个名字。
(bert) [op_dev@kvm embedding]$ docker run --network host --name feed_bert --restart=always -d feed_bert:v1 bash
08a4ef23a24ec3ce383da6fab330de58936258830f566c97ed81ffaf4dededdf
(bert) [op_dev@kvm embedding]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08a4ef23a24e feed_bert_embedding:v1 "bash run.sh" 7 seconds ago Restarting (1) Less than a second ago feed_bert
4.run 进入container
(bert) [op_dev@kvm embedding]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18c480f53403 feed_bert:v1 "/bin/bash" 3 hours ago Up 3 hours sad_roentgen
91dc43468e90 qunlp:v1 "/bin/bash" 3 days ago Up 47 hours sad_mestorf
(bert) [op_dev@kvm embedding]$ docker exec -it 18c480f53403 bash
[root@18c480f53403 app]#
5.进入容器
docker起服务后,进入bash。docker exec
后边可以跟多个参数,这里主要说明 -i
-t
参数。只用 -i
参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。当 -i
-t
参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。如果从这个 stdin 中 exit,不会导致容器的停止。
(bert) [op_dev@kvm embedding]$ docker exec -it feed_bert bash
[root@kvm app]#
6.删除镜像
注意点:
1. 删除前需要保证容器是停止的 stop
2. 需要注意删除镜像和容器的命令不一样。 docker rmi ID ,其中 容器(rm) 和 镜像(rmi)
3. 顺序需要先删除容器,再删除镜像
一.查看镜像
(bert) [op_dev@kvm embedding]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 37b975515171 18 hours ago 1.29GB
feed_bertg v1 0a4b7ab9de6c 19 hours ago 4.97GB
我们要删除feed_bert这个镜像
二. 查询容器
-a有没有运行的容器,都会展示出来
(bert) [op_dev@kvm embedding]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24644498c456 feed_bert:v1 "/bin/bash" 19 hours ago Up 19 hours upbeat_jackson
三.看看容器是否运行,如果在运行,则杀掉进程
(bert) [op_dev@kvm embedding]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24644498c456 feed_bert:v1 "/bin/bash" 19 hours ago Up 19 hours upbeat_jackson
如果不停止运行容器,直接rm容器id是什么样子呢?会告诉你,删除容器前先停掉容器
(bert) [op_dev@kvm1 embedding]$ sudo docker rm 24644498c456
Error response from daemon: You cannot remove a running container 24644498c4568541f7962ff49cf44b147082334464cc08af80bd375aa52b235c. Stop the container before attempting removal or force remove
杀掉进程:
(bert) [op_dev@kvm embedding]$ sudo docker kill 24644498c456
24644498c456
(bert) [op_dev@kvm embedding]$
在看容器的进程,此时已经没有运行的进程了了
(bert) [op_dev@kvm embedding]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(bert) [op_dev@kvm embedding]$
容器的情况:从status可以看到,两分钟前已经exit了
(bert) [op_dev@kvm embedding]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24644498c456 feed_bert:v1 "/bin/bash" 19 hours ago Exited (137) 2 minutes ago upbeat_jackson
四.删除容器文件:
(bert) [op_dev@kvm embedding]$ sudo docker container rm 24644498c456
24644498c456
此时容器文件已经没有了
(bert) [op_dev@kvm embedding]$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
五.删除image文件
(bert) [op_dev@kvm embedding]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
feed_bert v1 0a4b7ab9de6c 9 days ago 5.94GB
(bert) [op_dev@kvm embedding]$ sudo docker rm 0a4b7ab9de6c
Error: No such container: 0a4b7ab9de6c
(bert) [op_dev@kvm embedding]$ sudo docker rmi 0a4b7ab9de6c
Untagged: feed_bert:v1
Deleted: sha256:0a4b7ab9de6c55c2fffa93e71f260155e9509af7ee47a8d2fc3dd88b1d6f46d3
Deleted: sha256:dfe993dafcc4f23320ceba0fc8d538b1b1b0182b84fd78b55d620d618433bcc6
Deleted: sha256:2c1a9e48b99899ccd9c5e3718ae7848abd996e84e3f5b6ab05b9ab4b8d9723b3
Deleted: sha256:a2584f9ad1c460759423cc9c9510c9fdf36ad48d475402f57e61f21a7a1b520d
Deleted: sha256:2783b2d5dc902828a8e42ad165b5ce8de7059ff6b54923b74d0765ebcac9a2bc
(bert) [op_dev@kvm embedding]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
已经删除完毕。
7.docker退出容器不关闭容器
如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器.一定要按照顺序按这三个键。
参考:
1.https://yeasy.gitbook.io/docker_practice/container/attach_exec