Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
一款产品:开发–上线 两套环境:应用环境、应用配置
项目部署的问题
开发–运维:在我的电脑可以运行,他人的电脑不可运行
环境配置是十分麻烦的,每一个机器都要部署环境(集群 Redis、ES、Hadoop…)
发布一个项目 (jar + (Redis MySQL jdk ES…)),项目能不能带上环境安装打包
java – apk – 发布(应用商店) – 安装即可用
java – jar(环境) – 打包项目带上环境(镜像) – (Docker仓库:商店) – 下载我们发布的镜像 – 直接运行即可
Docker 的思想就来自于集装箱
JRE – 多个应用(端口冲突)
隔离:Docker核心思想,打包装箱!每一个箱子都是互相隔离的
Docker 通过隔离机制,可以将服务器利用到极致
2010年,几个搞IT的年轻人在美国成立了一家公司 dotCloud
主要做一些 pass 的云计算服务,LXC有关的容器技术,容器技术被命名为Docker
主要基于 PaaS(Platform as a Service,平台及服务)平台为开发者提供服务
2013年,dotCloud 的 CEO
Solomon Hykes决定把 dotCloud 内部使用的 Container 容器技术单独拿出来开源,2013年3月发布Docker的V0.1版本,并且基本保持每月一个版本的迭代速度,到了8月,Docker已经足够火爆,并广受好评,各种各样的技术论坛和技术峰会都开始热烈讨论与推荐Docker,这时Docker才只发布到V0.6版本
2014年6月9日,Docker终于发布了V1.0版本,并举办了DockerCon2014大会,大会上来自google、ibm、Redhat、rackspace等公司的核心人物均发表了主题演讲,纷纷表示支持并加入Docker的阵营
优点
Docker 是基于 Go 语言开发的,开源项目
之前的虚拟机技术
虚拟机技术缺点:
容器化技术
容器化技术不是模拟一个完整的操作系统
比较Docker 和虚拟机技术的不同
DevOps(开发、运维)
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩容
使用了Docker之后,部署应用就和搭积木一样
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
更高效的计算资源利用
较少的内核使用更多的服务运行
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例!服务器的性能可以被压榨到机制
Docker 的基本组成
镜像(image):
Docker 镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像 => run => tomcat 容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
容器(container):
Docker 利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux 系统
仓库(repository):
仓库就是存放镜像的地方
仓库分为共有仓库和私有仓库
安装 Docker
环境准备
Linux 环境查看
# 系统内核时 3.10 以上的
[root@vinjcent ~]# uname -r
3.10.0-1160.el7.x86_64
# 系统版本
[root@vinjcent ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
下载地址:https://docs.docker.com/get-docker/
卸载有关docker的文件
# 1.卸载旧的版本
yum remove -y docker \
docker-client\
docker-client-latest\
docker-common docker-latest\
docker-latest-logrotate\
docker-logrotate docker-selinux\
docker-engine-selinux\
docker-engine
# 2.需要的安装包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3.设置镜像的仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用阿里云镜像
# 更新yum软件包索引
yum makecache fast
# 4.安装Docker docker-ce 社区版 -ee 企业版
yum -y install docker-ce docker-ce-cli containerd.io
# 5.启动 Docker
systemctl start docker
# 6.查看 Docker 状态
systemctl status docker
安装成功
# 版本命令查看
docker version
# 运行hello-world
docker run hello-world
# 查看下载的hello-world镜像
[root@vinjcent ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
卸载 docker
# 卸载docker依赖
yum remove docker-ce-cli container-io
# 删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker的默认工作路径
Docker 是怎么工作的?
Docker 是一个 Client - Server 结构系统,Docker 的守护进程运行在主机上。通过 Socket 从客户端访问
DockerServer 接收到 Docker - Client 的指令,就会执行这个命令
Docker 为什么会比 VM 快?
1、Docker 有着比虚拟机更少的抽象层
2、Docker 利用的是宿主机的内核,vm 需要 Guest OS
所以说,新建一个容器的时候,Docker 不需要像虚拟机那样重新加载一个操作系统的内核,避免引导。虚拟机时加载 Guest OS,分钟级别的,而 Docker 是利用宿主机的操作系统,省略了这个复杂的过程,秒级运行
Docker容器 | LXC | VM | |
---|---|---|---|
虚拟化类型 | OS虚拟化 | OS虚拟化 | 硬件虚拟化 |
性能 | 物理机性能 | 物理机性能 | 5%~20%损耗 |
隔离性 | NS 隔离 | NS 隔离 | 强 |
QoS | Cgroup 弱 | Cgroup 弱 | 强 |
安全性 | 中 | 差 | 差 |
Guest OS | 只支持 Linux | 只支持 Linux | 全部 |
可迁移性 | 强 | 弱 | 强 |
帮助命令
docker version # 显示 docker 的版本信息
docker info # 显示 docker 的系统信息,包括镜像和容器的数量
docker 命令 --help # 万能命令
docker system prune # 删除没有在用的镜像和容器
命令文档地址:https://docs.docker.com/engine/reference/run/
镜像命令
docker images
选项
名称,简写 | 默认 | 描述 |
---|---|---|
--all ,-a | 显示所有图像(默认隐藏中间图像) | |
--digests | 显示摘要 | |
--filter ,-f | 根据提供的条件过滤输出 | |
--format | 使用 Go 模板打印漂亮的图像 | |
--no-trunc | 不要截断输出 | |
--quiet ,-q | 仅显示图像 ID |
[root@vinjcent /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
### 解释
REPOSITORY # 镜像的仓库源
TAG # 镜像的标签
IMAGE ID # 镜像的id
CREATED # 镜像的创建时间
SIZE # 镜像的大小
### 可选项
[root@vinjcent /]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images) # 列出所有镜像
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs # 只显示镜像id
docker search 搜索镜像
# 可以使用帮助命令
[root@vinjcent /]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
# 可选项,通过收藏过滤
[root@vinjcent /]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12720 [OK]
mariadb MariaDB Server is a high performing open sou… 4881 [OK]
docker pull --help 下载命令
[root@vinjcent /]# docker pull --help
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
### 下载镜像 docker pull 镜像名:tag tag为版本号
# 如下载 mysql 镜像
[root@vinjcent /]# docker pull mysql
Using default tag: latest # 如果不写 tag,默认就是latest最新版本
latest: Pulling from library/mysql
c1ad9731b2c7: Already exists # 分层下载,docker image 的核心 联合文件系统
54f6eb0ee84d: Pull complete
cffcf8691bc5: Pull complete
89a783b5ac8a: Pull complete
6a8393c7be5f: Pull complete
af768d0b181e: Pull complete
810d6aaaf54a: Pull complete
2e014a8ae4c9: Pull complete
a821425a3341: Pull complete
3a10c2652132: Pull complete
4419638feac4: Pull complete
681aeed97dfe: Pull complete
Digest: sha256:548da4c67fd8a71908f17c308b8ddb098acf5191d3d7694e56801c6a8b2072cc # 签名,防伪标志
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# docker pull mysql ===> docker pull docker.io/library/mysql:latest
### 指定版本下载,指定的版本必须是在官方文档中的版本
[root@vinjcent /]# docker pull mysql:5.7
5.7: Pulling from library/mysql
c1ad9731b2c7: Already exists
54f6eb0ee84d: Already exists
cffcf8691bc5: Already exists
89a783b5ac8a: Already exists
6a8393c7be5f: Already exists
af768d0b181e: Already exists
810d6aaaf54a: Already exists
81fe6daf2395: Pull complete
5ccf426818fd: Pull complete
68b838b06054: Pull complete
1b606c4f93df: Pull complete
Digest: sha256:7e99b2b8d5bca914ef31059858210f57b009c40375d647f0d4d65ecd01d6b1d5
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
查看镜像和删除镜像
### 查看镜像
[root@vinjcent /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 2a0961b7de03 2 weeks ago 462MB
mysql latest 65b636d5542b 2 weeks ago 524MB
hello-world latest feb5d9fea6a5 8 months ago 13.3kB
### 删除镜像
# 单个删除
[root@vinjcent /]# docker rmi -f 2a0961b7de03 # 根据镜像id删除
Untagged: mysql:5.7
Untagged: mysql@sha256:7e99b2b8d5bca914ef31059858210f57b009c40375d647f0d4d65ecd01d6b1d5
Deleted: sha256:2a0961b7de03c7b11afd13fec09d0d30992b6e0b4f947a4aba4273723778ed95
Deleted: sha256:2fbd454d39f146da1c0747174089b983c1cf1da7a062384e5a71a94f540141ab
Deleted: sha256:60ce6f6a8d71e66bd7ca1dae1f84a5faedfb993c1a0f352b90597b73eb94d56e
Deleted: sha256:226a653f6ee6b0184d7a6304f29976dc89b0e54e2eec2027d0e3cf87cbe8f2af
Deleted: sha256:218468cc1e9e25a831221617115da837798856793eb7decb3b089c8a1b5bd98f
# 批量删除指定id镜像
[root@vinjcent /]# docker rmi -f 容器id 容器id 容器id 容器id
# 批量删除全部镜像
[root@vinjcent /]# docker rmi -f $(docker images -aq)
容器命令
说明:有了镜像才可以创建容器,Linux,下载一个CentOS镜像来测时学习
[root@vinjcent /]# docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" # 容器名字 tomcat01 tomcat02,用来区分容器
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器的端口 -p 8080:8080
-p ip:[主机端口]:[容器端口]
-p [主机端口]:[容器端口] # 常用
-p [容器端口]
[容器端口]
-P # 随机指定端口
测试
# 测试 启动并进入容器
[root@vinjcent /]# docker run -it centos /bin/bash
[root@9ed34e2034df /]# ls # 查看容器内部的centos 基础版本 很多命令都是不完善的
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
# 从容器中推出主机
[root@9ed34e2034df /]# exit
列出所有的运行的容器
[root@vinjcent /]# docker ps [命令]
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器 + 带出历史运行过的热熔器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
# 命令
[root@vinjcent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@vinjcent /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ed34e2034df centos "/bin/bash" 2 hours ago Exited (0) 2 minutes ago flamboyant_kilby
c0427f357a6b feb5d9fea6a5 "/hello" 27 hours ago Exited (0) 27 hours ago vibrant_golick
ffcd711ddecf feb5d9fea6a5 "/hello" 8 weeks ago Exited (0) 8 weeks ago elastic_bassi
[root@vinjcent /]# docker ps -aq
9ed34e2034df
c0427f357a6b
ffcd711ddecf
退出容器
exit # 直接退出容器并停止
Ctrl + P + Q # 容器不停止退出
删除容器
docker rm [容器id] # 删除指定的容器 不能删除正在运行的容器,如果需要强制删除需要加上"-f"
docker rm -f $(docker ps -aq) # 批量删除所有容器
docker ps -a -q|xargs docker rm # 删除所有的容器
启动和停止容器的操作
docker start [容器id] # 启动容器
docker restart [容器id] # 重启容器
docker stop [容器id] # 停止当前正在运行的容器
docker kill [容器id] # 强制停止当前容器
后台启动容器
# 命令 docker run -d 镜像名
[root@vinjcent /]# docker run -d centos
# 问题: docker ps 发现 centos 停止了
# docker 容器使用后台运行,就必须要有一个前台进程, docker 发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
[root@vinjcent /]# docker logs -f -t --tail [条数] [容器]
# 容器,没有日志,需要自己编写一段脚本
[root@vinjcent /]# docker run -d centos /bin/sh -c "while true;do echo vinjcent;sleep 1;done"
4d8476f0bb140a04e214410c5e1fa5d27d72d27ddfb9a1a2698d94c297c889d6
[root@vinjcent /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d8476f0bb14 centos "/bin/sh -c 'while t…" 4 seconds ago Up 3 seconds busy_newton
### 显示日志
# 参数
# -tf 显示日志 + 时间戳
# --tail [number] 要显示日志条数
[root@vinjcent /]# docker logs -t -f --tail 10 4d8476f0bb14
2022-06-14T13:58:39.356795996Z vinjcent
2022-06-14T13:58:40.359859541Z vinjcent
2022-06-14T13:58:41.363560885Z vinjcent
2022-06-14T13:58:42.366830529Z vinjcent
2022-06-14T13:58:43.370121873Z vinjcent
2022-06-14T13:58:44.373577217Z vinjcent
2022-06-14T13:58:45.377856761Z vinjcent
2022-06-14T13:58:46.381298105Z vinjcent
2022-06-14T13:58:47.385041650Z vinjcent
2022-06-14T13:58:48.388769594Z vinjcent
2022-06-14T13:58:49.392300637Z vinjcent
2022-06-14T13:58:50.396323781Z vinjcent
2022-06-14T13:58:51.400915426Z vinjcent
2022-06-14T13:58:52.403562670Z vinjcent
查看容器中进程信息
[root@vinjcent /]# docker top 225ba423dae7
UID PID PPID C STIME TTY
root 28576 28557 0 22:04 ?
root 28679 28576 0 22:04 ?
查看镜像元数据
### 命令
# 测试
[root@vinjcent /]# docker inspect 225ba423dae7
[
{
"Id": "225ba423dae77a8b56fa9c377cf658c8576ad998d5520ca1c8784b87fa495ce7",
"Created": "2022-06-14T14:04:21.513093526Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo vinjcent;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 28576,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-06-14T14:04:21.790054038Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/225ba423dae77a8b56fa9c377cf658c8576ad998d5520ca1c8784b87fa495ce7/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/225ba423dae77a8b56fa9c377cf658c8576ad998d5520ca1c8784b87fa495ce7/hostname",
"HostsPath": "/var/lib/docker/containers/225ba423dae77a8b56fa9c377cf658c8576ad998d5520ca1c8784b87fa495ce7/hosts",
"LogPath": "/var/lib/docker/containers/225ba423dae77a8b56fa9c377cf658c8576ad998d5520ca1c8784b87fa495ce7/225ba423dae77a8b56fa9c377cf658c8576ad998d5520ca1c8784b87fa495ce7-json.log",
"Name": "/quirky_elbakyan",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/bd417e616c9350f6c83b33a29393f7009e0733c43fdd964f6f3715af347bbc6d-init/diff:/var/lib/docker/overlay2/7a6824197cd5c69855ee6ae929dd7fb9eb3773080d16a86cc17199fcea237f26/diff",
"MergedDir": "/var/lib/docker/overlay2/bd417e616c9350f6c83b33a29393f7009e0733c43fdd964f6f3715af347bbc6d/merged",
"UpperDir": "/var/lib/docker/overlay2/bd417e616c9350f6c83b33a29393f7009e0733c43fdd964f6f3715af347bbc6d/diff",
"WorkDir": "/var/lib/docker/overlay2/bd417e616c9350f6c83b33a29393f7009e0733c43fdd964f6f3715af347bbc6d/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "225ba423dae7",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo vinjcent;sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "27b6231180fb44f4ac6f15743619308ad2ab1d0692d2ff772daccbb4c5296dc2",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/27b6231180fb",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "e71be273d72baa53f78105199d45b7471a7faab0dd8be4084443598ff6b40366",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "5c78d917314066e9abeddb8ff3d39a1e2a709937e0dce02315d6f5267868e1ab",
"EndpointID": "e71be273d72baa53f78105199d45b7471a7faab0dd8be4084443598ff6b40366",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
# 通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 命令
docker exec -it [容器id] /bin/bash
# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp [容器id]:容器内路径 目的的主机
# 查看当前主机目录下
[root@vinjcent home]# ls
totoro vinjcent.java
[root@vinjcent home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38c0bf42df15 centos "/bin/bash" About a minute ago Up About a minute lucid_shannon
# 进入 docker 容器内部
[root@vinjcent home]# docker attach 38c0bf42df15
[root@38c0bf42df15 /]# cd /home
[root@38c0bf42df15 home]# ls
# 在容器内新建一个文件夹
[root@38c0bf42df15 home]# touch test.java
[root@38c0bf42df15 home]# exit
exit
[root@vinjcent home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@vinjcent home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38c0bf42df15 centos "/bin/bash" 2 minutes ago Exited (0) 19 seconds ago lucid_shannon
# 将这个文件拷贝出来到主机上
[root@vinjcent home]# docker cp 38c0bf42df15:/home/test.java /home
[root@vinjcent home]# ls
test.java totoro vinjcent.java
# 拷贝是一个手动的过程,未来使用 -v 卷的技术,推荐使用数据卷技术,可以实现自动同步主机和容器的目录
常用 Docker 命令
docker attach [OPTIONS] CONTAINER # 当前 shell 下 attach 链接指定运行环境
docker build [OPTIONS] PATH | URL | - # 通过 Dockerfile 定制镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] # 提交档期那容器为新的镜像
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- # 从容器中拷贝指定文件或者目录到宿主机中
docker create [OPTIONS] IMAGE [COMMAND] [ARG...] # 创建一个新的容器,同run,但不启动容器
docker diff CONTAINER # 查看 docker 容器变化
docker events [OPTIONS] # 从 docker 服务获取容器实时事件
docker exec [OPTIONS] CONTAINER COMMAND [ARG...] # 在已存在的容器上运行命令
docker export [OPTIONS] CONTAINER # 导出容器的内容流作为一个 tar 归档文件[对应import]
docker history [OPTIONS] IMAGE # 展示一个镜像的形成史
docker image COMMAND # 列出系统当前镜像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] # 从 tar 包中的内容创建一个新的文件系统映像[对应export]
docker info [OPTIONS] # 显示系统相关信息
docker inspect [OPTIONS] NAME|ID [NAME|ID...] # 查看容器详细信息
docker kill [OPTIONS] CONTAINER [CONTAINER...] # kill 指定 docker 容器
docker load [OPTIONS] # 从一个 tar 包中加载一个镜像[对应save]
docker login [OPTIONS] [SERVER] # 注册或者登录一个 docker 源服务器
docker logout [SERVER] # 从当前 Docker register 退出
docker logs [OPTIONS] CONTAINER # 输出当前容器日志信息
docker port CONTAINER [PRIVATE_PORT[/PROTO]] # 查看映射端口对应的容器内部源端口
docker pause CONTAINER [CONTAINER...] # 暂停容器
docker ps [OPTIONS] # 列出容器列表
docker pull [OPTIONS] NAME[:TAG|@DIGEST] # 从 docker 镜像源服务器拉取指定镜像或者库镜像
docker push [OPTIONS] NAME[:TAG] # 推送指定镜像或者库镜像至 docker 源服务器
docker restart [OPTIONS] CONTAINER [CONTAINER...] # 重启运行的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...] # 移除一个或者多个容器
docker rmi [OPTIONS] IMAGE [IMAGE...] # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需要删除相关容器才可继续或 -f 强制删除]
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 创建一个新的容器并运行一个命令
docker save [OPTIONS] IMAGE [IMAGE...] # 保存一个镜像为一个 tar 包[对应 load]
docker search [OPTIONS] TERM # 在 docker hub 中搜索镜像
docker start [OPTIONS] CONTAINER [CONTAINER...] # 启动容器
docker stop [OPTIONS] CONTAINER [CONTAINER...] # 停止容器
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] # 给源中镜像打标签
docker top CONTAINER [ps OPTIONS] # 查看容器中运行的进程信息
docker unpause CONTAINER [CONTAINER...] # 取消暂停容器
docker version [OPTIONS] # 查看 docker 版本号
docker wait CONTAINER [CONTAINER...] # 截取容器停止时的退出状态值