docker容器操作
从根本上讲,一个容器不过是一个正在运行的进程,并对其应用了一些附加的封装功能,以使其与主 机和其他容器隔离。容器隔离的最重要方面之一是每个容器都与自己的专用文件系统进行交互。该文件系 统由Docker镜像提供。镜像包括运行应用程序所需的一切代码或二进制文件,运行时的依赖项以及所需 的任何其他文件系统对象
创建容器
使用centos7来创一个容器
此时创建的容器是未运行的、
可以使用docker create创建一个容器,创建后,可以通过docker ps或者docker ps -a命令进行查看
[root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 39286ab8a5e1 4 weeks ago 188MB centos 7 eeb6ee3f44bd 2 years ago 204MB [root@node1 ~]# docker create -it centos:7 58ccb862c79156de3af68da242f947878f2b78c9df93568763359e0d0f500334 [root@node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ccb862c791 centos:7 "/bin/bash" 10 seconds ago Created compassionate_moore
启动容器
[root@node1 ~]# docker start 58ccb862c791 58ccb862c791 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ccb862c791 centos:7 "/bin/bash" About a minute ago Up 3 seconds compassionate_moore
使用docker create 命令新建的容器处于停止状态,可以使用docker start命令来启动它
运行容器
除了创建容器后通过start命令来启动,也可以直接新建并启动容器。所需要的命令主要为docker run,等价于先 执行docker create命令,再执行docker start命令。下面的命令启动一个bash终端,运行用户进行交互。
[root@node1 ~]# docker run -it centos:7 /bin/bash [root@73df7b6fe865 /]# exit // 此时进入了交互模式 exit // 退出后使用docker ps查看 [root@node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73df7b6fe865 centos:7 "/bin/bash" 12 seconds ago Exited (0) 5 seconds ago dazzling_engelbart
对于创建的bash容器,当用户使用exit命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当 其中的应用退出后,容器的使命完成,也就没有继续运行的必要了。
暂停容器
可以使用docker pause 命令来暂停一个运行中的容器
[root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ccb862c791 centos:7 "/bin/bash" 7 minutes ago Up 6 minutes compassionate_moore [root@node1 ~]# docker pause 58ccb862c791 58ccb862c791 [root@node1 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ccb862c791 centos:7 "/bin/bash" 8 minutes ago Up 7 minutes (Paused) compassionate_moore
暂停后的容器恢复到运行状态
处于paused状态的容器,可以使用docker unpause命令来恢复到运行状态。
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a6831bba185 centos:7 "/bin/bash" 23 minutes ago Up 20 minutes (Paused) exciting_wilbur [root@docker ~]# docker unpause 8a6831bba185 8a6831bba185 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8a6831bba185 centos:7 "/bin/bash" 23 minutes ago Up 20 minutes exciting_wilbu
停止容器
可以使用docker stop来终止一个运行中的容器。
[root@docker ~]# docker stop 8a6831bba185 8a6831bba185 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f7e96703cf24 centos:7 "/bin/bash" 10 minutes ago Exited (0) 10 minutes ago mycentoscy b6b993b7b2a4 centos:7 "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago centos 7ab8edfe7f23 centos:cy "/bin/bash" 19 minutes ago Exited (0) 16 minutes ago modest_brown 8a6831bba185 centos :7 " /bin/bash" 30 minutes ago Ex ited (137) 12 seconds ago exciting_wilbur 此时,执行docker container prune命令,会自动清除掉所有处于停止状态的容器。 [root@docker ~]# docker container
进入容器
在使用-d参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入: docker attach:不建议大家使用docker attach,因为退出容器终端,会导致容器的停止。 docker exec:推荐大家使用docker exec命令,因为退出容器终端,不会导致容器的停止。
attach
[root@docker ~]# docker attach httpd [root@e710eb97bcbc /]# exit exit [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e710eb97bcbc httpd:cycy "/bin/bash" 53 seconds ago Exited (0) 21 seconds ago
exec
[root@node1 ~]# docker run -itd --name nginx12 nginx:latest /bin/bash ebb9a6d499f9116f0937e41a596b1841b1c08bc4fe6960050ebd2aa4d635b746 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebb9a6d499f9 nginx:latest "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 80/tcp nginx12 [root@node1 ~]# docker exec -it nginx12 /bin/bash root@ebb9a6d499f9:/# ls bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint.d etc lib media opt root sbin sys usr root@ebb9a6d499f9:/# exit exit [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebb9a6d499f9 nginx:latest "/docker-entrypoint.…" 43 seconds ago Up 42 seconds 80/tcp nginx12
删除容器
删除容器使用docker rm命令,只能删除停止的容器
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82aec4e96622 httpd:cycy "/bin/bash" 3 minutes ago Up 3 minutes 80/tcp httpd [root@docker ~]# docker stop httpd httpd [root@docker ~]# docker rm httpd httpd [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NA
默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果要直 接删除一个运行中的容器,可以添加-f参数。
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74c75d56383b httpd:cycy "/bin/bash" 3 seconds ago Up 2 seconds 80/tcp httpd [root@docker ~]# docker rm httpd E r r o r r e s p o n s e f r o m d a e m o n : Y o u c a n n o t r e m o v e a r u n n i n g c o n t a i n e r 74c75d56383b27e0d979cfda1db4c894d 9a367270a208ef72cc04e8550f6fc55. Stop the container before attempting removal or force remove [root@docker ~]# docker rm httpd -f httpd [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM
导出容器
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用docker的导入和导出功能,这也是docker 自身提供的一个重要特性。
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令。“-o”选项也可以重定向“>”来代替
[root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebb9a6d499f9 nginx:latest "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 80/tcp nginx12 [root@node1 ~]# docker export -o test-nginx.tar ebb9a6d499f9 [root@node1 ~]# ls anaconda-ks.cfg nginx test-nginx.tar
导入容器
docker import导入容器
导入容器,导出的文件又可以使用docker import命令导入变成镜像。
[root@node1 ~]# docker import test-nginx.tar mytest:nginx1 sha256:e10888e9e2e615505a3bcc6a450fcb6311e47d2a68f984ff1303e06bb00a2c09 [root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mytest nginx1 e10888e9e2e6 6 seconds ago 186MB nginx latest 39286ab8a5e1 4 weeks ago 188MB
docker容器的应用
1、映射随机端口
当我们启动一个web容器的时候,可以将容器的端口映射宿主机上面,这样便于我们访问该web服务器。 -P参数将容器内部使用的80端口映射到宿主机的随机端口上来。
[root@node1 ~]# docker run --name nginx -itd -P nginx:latest eeb0c9c83a41b5a5a3608612a7d5b98328aad14f9a34d35dfcefd5dc2b5c4983 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eeb0c9c83a41 nginx:latest "/docker-entrypoint.…" 57 seconds ago Up 56 seconds 0.0.0.0:32768->80/tcp, [::]:32768->80/tcp nginx
2、映射指定端口
我们也可以通过-p参数将容器内的80端口映射到宿主机的指定端口上,
[root@docker ~]# docker run --name httpd2 -itd -p 8080:80 httpd:latest d5e5e991b5dc5becad63a8ba874c0ac583fea34a2b63081736aa2ea1f9d8ec6f [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d5e5e991b5dc httpd:latest "httpd-foreground" 4 seconds ago Up 3 seconds 0.0.0.0:8080- >80/tcp, :::8080->80/tcp httpd2
查看容器日志
[root@node1 ~]# docker logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2024/09/12 10:34:28 [notice] 1#1: using the "epoll" event method
2024/09/12 10:34:28 [notice] 1#1: nginx/1.27.1
2024/09/12 10:34:28 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/09/12 10:34:28 [notice] 1#1: OS: Linux 5.14.0-427.13.1.el9_4.x86_64
2024/09/12 10:34:28 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1073741816:1073741816
2024/09/12 10:34:28 [notice] 1#1: start worker processes
2024/09/12 10:34:28 [notice] 1#1: start worker process 28
查看容器详细信息
root@node1 ~]# docker inspect nginx
[
{
"Id": "eeb0c9c83a41b5a5a3608612a7d5b98328aad14f9a34d35dfcefd5dc2b5c4983",
"Created": "2024-09-12T10:34:27.942912588Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 4330,
"ExitCode": 0,
"Error": "",
"StartedAt": "2024-09-12T10:34:28.021736165Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
docker容器部署WEB服务器
1、需要创建一个nginx站点
2、创建目录,用于存放映射数据。其中www目录将映射为nginx容器配置的虚拟目录;logs目录将映射为nginx容器的日志目录;conf目录里的配置文件将映射为nginx容器的配置文件
3、将主机端口20000映射到容器的80端口上
4、网页内容为welcome to wuhan
5、最终能够成功访问nginx站点
下载nginx镜像
创建映射目录
拷贝容器内nginx默认配置文件到被美帝当前目录下的conf目录
创建端口映射,目录映射
创建一个网页
访问
1、docker container cp 复制文件 例如,将 本地的路径 data 复制到 centos 容器的/tmp 路径下:
[root@docker ~]# docker container cp data d5e5e991b5dc:/tmp
2、docker container diff 查看变更 例如,查看 d5e5e991b5dc 容器内的数据修改 [root@docker ~]# docker container diff d5e5e991b5dc
3、docker container port 查看端口映射
[root@docker ~]# docker container port d5e5e991b5d
docker images 查看本地镜像
docker search 查找镜像
docker pull 下载镜像
docker tag 给镜像打标签
docker rmi 删除镜像
docker save 导出镜像
docker load 导入镜像
docker inspect 镜像名 查看该镜像的详细信息
docker ps 查看当前系统正在运行的容器
docker ps -a 查看当前系统中所有的容器,包括停止的容器
docker create 创建容器(但未运行)
docker start 启动容器
docker stop 停止容器
docker pause 暂停容器
docker unpause 恢复容器
docker run 创建并运行容器 等于docker create+docker start
docker exec -it 容器名 /bin/bash 进入容器
docker rm 删除容器
docker export 导出容器
docker import 导入容器
docker cp 复制文件到容器里,或者将容器里的文件拉取到本地
docker logs 查看某个容器的日志
docker inspect 容器名 查看该容器的详细信息
docker run -P(大写) 随机映射端口
docker run -p(小写) 本地端口:容器端口 手动指定映射端口
docker run -v 卷的挂载,将本地的目录或者文件与容器里的目录或文件做一个映射