Docker基础知识
Dokcer基础知识
Docker和虚拟技术的区别
- 虚拟技术需要虚拟硬件,运行一个完整的操作系统,然后在操作系统上运行应用
- 虚拟技术启动速度较慢,体积较大
- 容器内的应用直接运行在宿主机上,容器没有自己的内核(kernel),也没有虚拟硬件
- 每个容器相互隔离,每个容器内都有一个属于自己的文件系统,互不影响
- 容器启动速度快,体积小
Docker基本名词
-
镜像(image)
镜像就是一个模板,可以通过这个模板创建容器服务 -
容器(container)
Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建 -
仓库(repository)
仓库是存放镜像的地方,仓库分为公有仓库(Dokcer Hub)和私有镜像,需配置镜像加速,提高拉取镜像速度
Docker安装
# 1、卸载旧版docker
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、设置镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#4、安装docker相关包,docker-ce社区版本,docker-ee企业版本
yum install docker-ce docker-ce-cli containerd.io
# 5、启动Dokcer
systemctl start docker
# 6、查看是否安装成功、
docker version
# 7、运行hello-world镜像
docker run hello-world
# 8、卸载Docker
yum remove docker-ce docker-ce-cli container.io
# 9、删除资源
rm -rf /var/lib/docker # /var/lib/docker是docker默认工作路径
阿里云镜像加速
登录阿里云后,在容器服务中找到镜像地址
# mkdir -p /etc/docekr
# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://s7t9j923.mirror.aliyuncs.com"]]
}
Docker常用命令
帮助命令
docker version # 显示docker基本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令
镜像命令
docker images 查看主机上的镜像信息
[root@angrykun ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest ecac195d15af 3 weeks ago 516MB
hello-world latest feb5d9fea6a5 7 weeks ago 13.3kB
# 解释
REPOSITORY :仓库
TAG: 版本
IMAGE ID:镜像Id
SIZE:大小
# 参数
-a # 列出所有镜像
-f # 过滤镜像
-q #列出所有镜像Id
[root@angrykun ~]# docker images -f "dangling=true" //过滤标记为空的镜像
docker search 搜索命令
[root@angrykun ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11680 [OK]
mariadb MariaDB Server is a high performing open sou… 4450 [OK]
# 可选项
--filter=STARS=3000 # 加上过滤条件
docker pull 拉取镜像
[root@angrykun ~]# docker pull mysql
Using default tag: latest # 默认tag是latest
latest: Pulling from library/mysql
b380bbd43752: Pull complete # 分层下载,docker image的核心是联合文件系统
f23cbf2ecc5d: Pull complete
30cfc6c29c0a: Pull complete
b38609286cbe: Pull complete
8211d9e66cd6: Pull complete
2313f9eeca4a: Pull complete
7eb487d00da0: Pull complete
4d7421c8152e: Pull complete
77f3d8811a28: Pull complete
cce755338cba: Pull complete
69b753046b9f: Pull complete
b2e64b0ab53c: Pull complete
Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 # 防伪签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# 等价语句(以下两个语句作用相同)
docker pull mysql
docker pull docker.io/library/mysql:latest
# 指定不同的版本镜像
docker pull mysql:tag # tag 为docker hub上支持的镜像版本,如docker pull mysql:5.7
docker rmi 删除镜像
[root@angrykun ~]# docker rmi 镜像Id # 删除单个镜像
[root@angrykun ~]# docker rmi 镜像Id1 镜像Id2 # 删除多个镜像
[root@angrykun ~]# docker rmi $(docker images -aq)像Id2 # 删除所有镜像
容器命令
docker run 启动容器
docker run [可选参数] image
# 参数说明
--name="Name" # 容器名称,如mysql1、mysql2用来区分容器
-d # 后台方式运行
-it #使用交互的方式运行,进入容器查看内容
-p # 指定容器端口 -p 80810:8080
# -p ip:主机端口:容器端口
# -p 主机端口:容器端口(常用)
# -p 容器端口
# 容器端口
-P # 随机指定端口
# 启动并进入容器
[root@angrykun ~]# docker run -it centos /bin/bash
[root@723b2a37f47d /]#
exit 退出容器
[root@723b2a37f47d /]# exit
exit # 退出后容器停止运行
ctrl+p+q # 退出容器,容器不停止运行
docker ps 查看运行容器
docker ps [可选参数]
# 列出正在裕兴的容器
-a # 列出所有容器
-n # 指定最近n个运行的容器
-q # 列出容器Id
docker rm 删除容器
docker rm 容器Id # 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除所有容器,-f 强制删除
docker ps -a -q|xargs docker rm # 删除所有容器
docker start 容器Id 启动容器
docker stop 容器Id 停止容器
docker restart 容器Id 重启容器
其他常用命令
docker run -d 后台启动容器
docker run -d 镜像名
docker run -d centos
# 问题 docker ps发现centos停止了
# 常见问题:docker容器使用后台运行,就必须有一个前台进程,docer发现没有应用会自动停止
# nginx容器启动后,发现没有提供服务会立刻停止,导致没有程序
docker logs 查看日志
docker logs -f -t --tail 10 镜像名称
docker top 查看容器内进行信息
[root@angrykun ~]# docker top b378829949f4
UID PID PPID
root 25104 25086
docker inspect 查看容器元数据信息
docker inspect 容器Id
docker exec -it 容器Id /bin/bash 进入容器
[root@angrykun ~]# docker exec -it b378829949f4 /bin/bash
[root@b378829949f4 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
docker attach 容器Id
[root@angrykun ~]# docker attach b378829949f4
[root@b378829949f4 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 区别
docker exec # 进入容器后开启一个新的终端,可以在新终端上操作(常用)
docker attach # 进入容器正在执行的终端,不会启动新的终端
docker cp 拷贝容器内文件至宿主机
[root@angrykun ~]# docker exec -it b378829949f4 /bin/bash
[root@b378829949f4 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@b378829949f4 /]# cd home/
[root@b378829949f4 home]# ls
[root@b378829949f4 home]# touch test.java
[root@b378829949f4 home]# ls
test.java
[root@b378829949f4 home]# exit
exit
[root@angrykun ~]# docker cp b378829949f4:/home/test.java /home
[root@angrykun ~]# ll
total 0
[root@angrykun ~]# cd /home/
[root@angrykun home]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 19 23:50 test.java
docker commit 提交容器成为一个新的镜像
docker commit -a="作者信息" -m="提交的描述信息" 容器Id 目标镜像名:[TAG]je
可视化
portainer 管理Dokcer可视化面板
docker run -d -p 8080:9200 portainer
容器数据卷
将容器数据持久化到宿主机中,容器之间有一个数据共享的技术。所有的Docker容器内的卷,在没有指定目录的情况下,都在
/var/lib/docker/volumes/xxx/_data目录
具名/匿名挂载 容器卷挂载方式
# 具名挂载
-v 卷名:容器内路径
[root@angrykun ~]# docker run -d -P --name nginx02 -v juming:/etc/nginx nginx
323520739b3807fdab74c70b4ed9e148fada85e2bbea0fe2882201c2fe24a26d
[root@angrykun ~]# docker volume ls
DRIVER VOLUME NAME
local d246a126aa4aa7dd40818a47062502aba2356ba65cdbaa0b927ccd7f56748d20
local juming
[root@angrykun ~]# docker volume inspect juming
[
{
"CreatedAt": "2021-11-22T23:47:12+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming/_data",
"Name": "juming",
"Options": null,
"Scope": "local"
}
]
# 匿名挂载
-v 容器内路径
[root@angrykun ~]# docker run -d -P --name nginx -v /etc/nginx nginx
fced79b6b3ac5b6b48630c23388ec95f025e83c741ba27c2309c5109c0b2ea82
[root@angrykun ~]# docker volume ls
DRIVER VOLUME NAME
local d246a126aa4aa7dd40818a47062502aba2356ba65cdbaa0b927ccd7f56748d20
# 如何确定挂载方式
-v 容器内路径 # 匿名内挂载
-v 卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器路径 # 指定路径挂载,一般宿主机中以/开头
# 拓展,通过 -v 容器内路径: ro rw 改变读写权限
ro readonly # 只读,容器内只读,可以在宿主机中操作
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
数据共享 多个容器共享文件
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是把数据持久化到本地后,本地数据不会删除。
--volumes-from 容器名
# 多个mysql实现数据共享
[root@angrykun ~]# docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@angrykun ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
Dockerfile
dockerfile是用来构建docker镜像文件的命令参数脚本。
构建步骤:
1、编写dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行进行
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
Dockerfile构建过程
基础知识:
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
Dockerfile指令
FROM # 基础镜像
MAINTAINER #维护者信息,姓名+邮箱
发布镜像
1、注册DockerHub账户
2、在服务器上提交自己的镜像
[root@angrykun ~]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
# 提交镜像
docker push 仓库名/镜像名:tag
docker push angrykun/centos:1.0
Docker网络
docker network ls 查看所有网络
[root@angrykun ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
ce9fc88ec872 bridge bridge local
6b4e9353507d host host local
c864e96f3e2e none null local
网络模式
- bridge: 桥接模式,docker默认使用bridger模式
- none: 不配置网络
- host: 和宿主机共享网络
- container: 容器网络连通(用的少,局限性很大)
测试
# 我们直接启动的命令,会默认在命令加上 --net birdge 这个就是docker0
docker run -d -P --name tomact01 tomact
docker run -d -P --name tomact01 --net bridge tomact
# docker0 特点:默认的网络模式,域名不能访问,容器间使用 --link 可以打通容器
#自定义网络
[root@angrykun ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[root@angrykun ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "ce164197f2cfcd3ebb7d8ec7a4395376c3ecb36d93f96bf7d7854e8c762fbe78",
"Created": "2021-11-28T13:31:53.740209968+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
docker network connect 网络连通
实战:部署Redis集群
# 创建redis网络
[root@angrykun ~]# docker network create redis --subnet 172.38.0.0/16
# 创建redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF >/mydate/redis/node-${port}/confg/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bust-port 16379
appendonly yes
EOF
done

浙公网安备 33010602011771号