docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,并且容器开销极其低。
docker官网:https://www.docker.com/
docker文档:https://docs.docker.com/
docker hub:https://hub.docker.com/
虚拟机:虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。包含系统内核、lib、app等,相对更加重量级
虚拟机的缺点:
Docker:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
两者的不同:
docker镜像就是一个只读模板,比如,一个镜像可以包含一个完整的centos,里面仅安装apache或用户的其他应用,镜像可以用来创建docker容器,另外docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下周一个已经做好的镜像来直接使用
docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台,可以把容器看做是要给简易版的linux环境(包括root用户权限、镜像空间、用户空间和网络空间等)和运行再其中的应用程序
仓库是集中存储镜像文件的地方,registry是仓库主从服务器,实际上参考注册服务器上存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下周,国内的阿里云,这里仓库的概念与Git类似,registry可以理解为github这样的托管服务
参考文档
下面以CentOS 7做安装说明,其他系统可以再参考文档中找到相关教程
# 1、卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、安装相关工具
yum install -y yum-utils
# 3、设置docker下载地址
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #国外镜像不推荐
yum-config-manager \
--add-repo \
https://mirror.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云镜像 推荐
#4、更新yum软件包索引
yum makecache fast
# 5、安装Docker ce是社区版,ee是企业版
yum install docker-ce docker-ce-cli containerd.io
# 6、启动docker
systemctl start docker
#7、hello world测试
docker run hello-world
出现下面的内容表示安装成功:
docker run hello-world
的运行流程:
#1、卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2、删除资源
rm -rf /var/lib/docker
1)、登录阿里云
产品与服务->容器镜像服务->镜像加速器
按照上述步骤打开页面,可以看到加速地址和步骤
2)、配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://**你自己的路径**.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker是一个C/S架构的系统,Docker的守护进程运行在主机上,可以通过Socket从客户端进行访问,Docker-Server可以接收Docker-Client的指令并执行。
docker version # 显示docker的版本信息
docker info # 显示docker的版本信息
docker 命令 --help # 查看相关命令的说明
docker命令的官方文档:https://docs.docker.com/reference/
docker images
查看下载的镜像
[root@Eva overlay2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 8e8c6f8dc9df 8 weeks ago 546MB
tomcat latest 31a47677561a 8 weeks ago 529MB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的版本
IMAGE ID 镜像的id
CREATED 精选的创建时间
SIZE 精选的大小
#可选项
-a, --all Show all images (default hides intermediate images) #显示所有镜像
-f, --filter filter Filter output based on conditions provided #过滤
-q, --quiet Only show numeric IDs #只显示id
docker search 名称
在docker hub中查询镜像
[root@Eva overlay2]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9629 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3497 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 702 [OK]
percona Percona Server is a fork of the MySQL relati… 490 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 77
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 69
#可选项
--filter=STARS=3000 #只搜索STARS是3000以上的
docker pull
下载镜像
docker pull 名称[:版本] #版本可省略,默认是最新版
[root@Eva overlay2]# docker pull mysql:5.7
5.7: Pulling from library/mysql #版本号,以及地址
8559a31e96f4: Pull complete #分层下载,docker image的核心 联合文件系统
d51ce1c2e575: Pull complete
c2344adc4858: Pull complete
fcf3ceff18fc: Pull complete
16da0c38dc5b: Pull complete
b905d1797e97: Pull complete
4b50d1c6b05c: Pull complete
d85174a87144: Pull complete
a4ad33703fa8: Pull complete
f7a5433ce20d: Pull complete
3dcd2a278b4a: Pull complete
Digest: sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854 #签名
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7 #真实地址
docker rmi
删除镜像
[root@Eva overlay2]# docker rmi 9cfcce23593a
Untagged: mysql:5.7
Untagged: mysql@sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854
Deleted: sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46a
Deleted: sha256:98de3e212919056def8c639045293658f6e6022794807d4b0126945ddc8324be
Deleted: sha256:17e8b88858e400f8c5e10e7cb3fbab9477f6d8aacba03b8167d34a91dbe4d8c1
Deleted: sha256:c04c087c2af9abd64ba32fe89d65e6d83da514758923de5da154541cc01a3a1e
Deleted: sha256:ab8bf065b402b99aec4f12c648535ef1b8dc954b4e1773bdffa10ae2027d3e00
Deleted: sha256:09687cd9cdf4c704fde969fdba370c2d848bc614689712bef1a31d0d581f2007
Deleted: sha256:b704a4a65bf536f82e5d8b86e633d19185e26313de8380162e778feb2852011a
Deleted: sha256:c37206160543786228aa0cce738e85343173851faa44bb4dc07dc9b7dc4ff1c1
Deleted: sha256:12912c9ec523f648130e663d9d4f0a47c1841a0064d4152bcf7b2a97f96326eb
Deleted: sha256:57d29ad88aa49f0f439592755722e70710501b366e2be6125c95accc43464844
Deleted: sha256:b17c024283d0302615c6f0c825137da9db607d49a83d2215a79733afbbaeb7c3
Deleted: sha256:13cb14c2acd34e45446a50af25cb05095a17624678dbafbcc9e26086547c1d74
docker rmi 镜像ID或者名称
docker rmi 镜像ID 镜像ID 镜像ID #删除多个镜像
docker rmi -f $(docker images -aq) #删除全部的镜像
说明:首先需要下载镜像,之后才能运行成容器,下面以运行CentOS为例:
首先下载镜像:
[root@Eva overlay2]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
新建并启动容器:
docker run [可选项] 镜像名称或ID
# 可选项
--name="name" #指定容器名称
-d #后台运行
-it #使用交互模式运行,进入容器查看内容
-p #指定运行的端口
-p 8080:8080 主机端口:容器端口
-p 8080 容器端口(不对外暴露)
#测试:
[root@Eva overlay2]# docker run -it centos /bin/bash #启动并进入容器内部
[root@a82a3f30cdba /]# ls #查看容器内部的centos,基础版本
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@a82a3f30cdba /]# exit #退出容器
exit
退出容器内部:
exit #推出容器内部,并停止容器
ctrl + p + q #退出但不停止容器
docker ps
查看正在运行的容器
[root@Eva overlay2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3b47f4d17b8 mysql "docker-entrypoint.s…" 8 weeks ago Up 47 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
docker ps -a
查看所有容器,包括没有运行的:
[root@Eva overlay2]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a82a3f30cdba centos "/bin/bash" 7 minutes ago Exited (0) 3 minutes ago loving_mclean
#其他可选项
-n=? #只显示最近运行的n个容器
-q #只显示容器编号
-ap #组合,获取所有容器的id,可用于删除
docker rm 容器ID
删除容器
[root@Eva overlay2]# docker rm f01613c648be e41ffbe686ff #删除指定容器,不能删除正在运行的容器
f01613c648be
e41ffbe686ff
docker rm -f $(docker ps -aq) #删除所有容器
启动和停止容器
docker start 容器ID #启动一个停止的容器
docker restart 容器ID #重启一个容器
docker stop 容器ID #停止一个正在运行的容器
docker kill 容器ID #强制停止容器
后台启动容器
docker run -d 镜像名称
[root@Eva overlay2]# docker run -d centos
c324f4e0e0bc6ce5347ffc02f0ab63a33b9ce5e7f37029ca2fc6fab6d38ecf8c
#问题:使用docker ps 发现容器停止了
#原因:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用就停止了
#例如nginx 容器启动之后,发现自己没有提供服务,就会立即停止
查看日志
[root@Eva overlay2]# docker logs -tf --tail 10 f3b47f4d17b8 #查看mysql日志,--tail后跟需要从看到的行数
2020-06-16T04:22:28.400711646Z 2020-06-16T04:22:28.390264Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
2020-06-16T05:24:04.958498064Z 2020-06-16 05:24:04+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
2020-06-16T05:24:05.106042194Z 2020-06-16 05:24:05+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
...
查看容器中的进程
docker top 容器ID
[root@Eva overlay2]# docker top f3b47f4d17b8 #
UID PID PPID C STIME TTY TIME CMD
systemd+ 21118 21101 0 13:24 ? 00:00:45 mysqld
查看镜像元数据
docker inspact 容器ID
[root@Eva overlay2]# docker inspect f3b47f4d17b8
[
{
"Id": "f3b47f4d17b84e449b6475ff781574e896e60cdf73a5282bfa6e1d7150afa60f",
"Created": "2020-04-19T16:23:49.741963292Z",
"Path": "docker-entrypoint.sh",
"Args": [
"mysqld"
],
"State": {
"Status": "running",
"Running": true,
....
进入当前正在运行的容器
通常我们的容器都是后台运行的,需要进入容器修改一些配置时可以使用该命令
#方法一
docker exec -it 容器ID /bin/bash
[root@Eva overlay2]# docker exec -it f3b47f4d17b8 /bin/bash
root@f3b47f4d17b8:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@f3b47f4d17b8:/# exit
exit
#方法二
docker attach 容器ID
#区别
# docker exec #进入容器后开启一个新的终端,可以在里面操作
# docker attach #进入容器正在执行的终端
容器和主机之间相互拷贝文件
#从容器中拷贝文件到主机
docker cp 容器ID:容器内路径 主机目的路径
#例子
[root@Eva ~]# docker exec -it f3b47f4d17b8 /bin/bash #进入容器内部
root@f3b47f4d17b8:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@f3b47f4d17b8:/# mkdir hello.world #创建文件夹
root@f3b47f4d17b8:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc hello.world home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@f3b47f4d17b8:/# exit
exit
[root@Eva ~]# docker cp f3b47f4d17b8:/hello.world ./ #将容器中的hello.world文件夹拷贝到当前路径
[root@Eva ~]# ls
hello.world
#从主机中拷贝文件到容器。也可以使用后面介绍的挂载 -v 实现
docker cp 主机目的路径 容器ID:容器内路径
查看容器的性能使用情况
[root@Eva ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f3b47f4d17b8 mysql 0.49% 369MiB / 1.795GiB 20.08% 0B / 0B 0B / 0B 39
管理命令:
config 管理Docker配置
container 管理容器
image 管理镜像
network 管理网络
node 管理Swarm节点
plugin 管理插件
secret 管理Docker安全
service 管理服务
swarm 管理Swarm集群
system 管理Docker系统
trust Manage trust on Docker images
volume 管理卷
命令:
attach 将标准输入和标准输出连接到正在运行的容器
build 使用dockerfile文件创建镜像
commit 从容器的修改项中创建新的镜像
cp 将容器的目录或文件复制到本地文件系统中
create 创建一个新的镜像
diff 检查容器文件系统的修改
events 实时输出docker服务器中发生的事件
exec 从外部运行容器内部的命令
export 将容器的文件系统到处为tat文件包
history 显示镜像的历史
images 输出镜像列表
import 从压缩为tar文件的文件系统中创建镜像
info 显示当前系统信息、docker容器与镜像个数、设置信息等
inspect 使用JSON格式显示容器与镜像的详细信息
kill 向容器发送kill信号关闭容器
load 从tar文件或标准输入中加载镜像
login 登录docker注册服务器
logout 退出docker注册服务器
logs 输出容器日志信息
pause 暂停容器中正在运行的所有进程
port 查看容器的端口是否处于开放状态
ps 输出容器列表
pull 从注册服务器中拉取一个镜像或仓库
push 将镜像推送到docker注册服务器
rename 重命名一个容器
restart 重启一个或多个容器
rm 删除一个或多个容器,若没有指定标签则删除lastest标签。
rmi 删除一个或多个镜像,若没有指定标签则删除lastest标签。
run 在一个新容器中中运行命令,用于指定镜像创建容器。
save 将一个或多个镜像保存为tar包
search 从Docker Hub中搜索镜像
start 启动一个或多个已经停止的容器
stats Display a live stream of container(s) resource usage statistics
stop 停止一个或多个正在运行的容器
tag 设置镜像标签
top 显示容器中正在运行的进程信息
unpause 重启pause命令暂停的容器
update 更新一个或多个容器的配置
version 显示docker版本信息
wait 等待容器终止然后输出退出码