docker学习笔记
Docker
Docker基础
Docker概述
Docker 平台的基本构成
![image-20220228233051432](/Users/root1/Library/Application Support/typora-user-images/image-20220228233051432.png)
Docker安装
环境准备
1、需要会⼀点点Linux基础
2、CentOS 7
3、Xshell 或者其它远程连接⼯具
环境查看
# 查看系统内核, 要求版本>3.10
uname -r
3.10.0-1062.12.1.el7.x86_64
# 查看系统版本等相关信息
cat /etc/os-release
安装
帮助⽂档:
# 1. 卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-engine
# 2. 安装依赖包
yum install -y yum-untils
# 3. 设置镜像仓库
yum-config-manager \
--add-repo \
download.docker/linux/po # 默认国外的镜像仓库
yum-config-manager \
--add-repo \
mirrors.aliyun/docker-ce/linux/po # 阿⾥云的镜像仓库(推荐)
# 更新yum软件包索引
yum makecache fast
# 4. 安装Docker相关, docker-ce 社区版  docker-ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 安装指定版本
yum install docker-ce-<VERSION-STRING> docker-ce-cli-<VERSION-STRING> container.io
# 5. 启动Docker
systemctl start docker
# 6. 使⽤docker version查看是否安装成功
docker version
# 7. 测试 HelloWorld!
docker run hello-world
# 8. 查看已下载的镜像
docker images
REPOSITORY    TAG      IMAGE ID      CREATED        SIZE
hello-world  latest    d1165f221234  5 months ago  13.3kB
卸载docker
# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 2. 删除资源
rm -rf /var/lib/docker # Docker的默认⼯作资源路径
安装-2
RedHat/CentOS必须要6.6版本以上,或者7.x才能安装docker,建议在RedHat/CentOS 7上使⽤docker,因为RedHat/CentOS 7的内核升级到了kernel 3.10,对lxc容器⽀持更好。
查看Linux内核版本(内核版本必须是3.10或者以上):
cat /proc/version
uname -a
lsb_release -a
# ⽆法执⾏命令安装
yum install -y redhat-lsb
更新YUM源:
yum update
安装:
yum  install docker -y
检查版本:
docker -v
安装完成后,使⽤下⾯的命令来启动 docker 服务,并将其设置为开机启动:
service docker start
chkconfig docker on
阿⾥云镜像加速
1. 登陆阿⾥云, 到"容器镜像服务"
2. 到"镜像加速器"
3. 配置使⽤
4. 重启Docker服务
docker run 的运⾏流程
底层原理
Docker是怎么⼯作的?
Docker 是⼀个 Client-Server 结构的系统, Docker的守护进程运⾏在主机上. 通过Socket从客户端访问!
DockerServer 接收到 Docker-Client 的指令, 就会执⾏这个命令!
Docker 为什么⽐ VM 快?
1. Docker 有着⽐虚拟机更少的抽象层
2. Docker 利⽤的是宿主机的内核, VM 需要的是Guest OS
所以说, 新建⼀个容器的时候, docker不需要像虚拟机⼀样重新家在⼀个操作系统内核, 避免隐⼑. 虚拟机是加载Guest OS , 分钟级别的. ⽽Docker 是利⽤宿主机的操作系统, 省略了这个复杂的过程, 秒级!
Docker的常⽤命令
帮助命令
docker verion              # 显⽰ docker 的版本信息
docker info                # 显⽰ docker 的系统信息, 包括镜像和容器的数量等
docker COMMAND --help      # 帮助命令
帮助⽂档的地址:
镜像命令
docker images
[root@Oskari docker]# docker images
REPOSITORY          TAG                IMAGE ID            CREATED            SIZE
docker.io/centos    7                  8652b9f0cb4c        8 months ago        204 MB
# 解释
REPOSITORY                  # 镜像的仓库员
TAG                        # 镜像的标签
IMAGE ID                    # 镜像的id
CREATED                    # 镜像的创建时间
SIZE                        # 镜像的⼤⼩
# 可选项
-a                          # 列出所有镜像
-q                          # 指向是镜像的id
docker search 搜索镜像
[root@Oskari docker]# docker search mysql
INDEX      NAME                                        DESCRIPTION                                    STARS    OFFICIAL 
AUTOMATED docker.io  docker.io/mysql                            MySQL is a widely used,   11205    [OK]      docker.io  docker.io/mariadb                          MariaDB Server is a high performing   4259      [OK]      docker.io  docker.io/mysql/mysql-server                Optimized MySQL Server Docker images.   833                  [OK] docker.io  docker.io/percona                          Percona Server is a fork of the   548      [OK]      docker.io  docker.io/phpmyadmin                        phpMyAdmin - A web interface for   286      [OK]
# 可选项
Name, shorthand Default Description
--filter , -f          Filter output based on conditions provided
--format                Pretty-print search using a Go template
--limit 25              Max number of search results
--no-trunc              Don't truncate output
# 通过收藏数量过滤
--filter=STARS=3000    # 搜索STARS数量⼤于3000的
[root@Oskari docker]# docker search mysql -f=stars=3000
INDEX      NAME                DESCRIPTION                                    STARS    OFFICIAL  AUTOMATED
docker.io  docker.io/mysql    MySQL is a widely used, open-source relati (11205)
docker.io  docker.io/mariadb  MariaDB Server is a high performing open s (4259)
docker pull 拉取镜像
# 下载镜像  docker pull IMAGENAME[:tag]
[root@Oskari docker]# docker pull mysql
Using default tag: latest          # 如果不写 tag ,  默认拉取最新版本
Trying to pull repository docker.io/library/mysql ...
latest: Pulling from docker.io/library/mysql
33847f680f63: Pull complete        # 分层下载, docker image 核⼼ [联合⽂件系统]
5cb67864e624: Pull complete
1a2b594783f5: Pull complete
b30e406dd925: Pull complete
48901e306e4c: Pull complete
603d2b7147fd: Pull complete
802aa684c1c4: Pull complete
715d3c143a06: Pull complete
6978e1b7a511: Pull complete
f0d78b0ac1be: Pull complete
35a94d251ed1: Pull complete
36f75719b1a9: Pull complete
Digest: sha256:8b928a5117cf5c2238c7a09cd28c2e801ac98f91c3f8203a8938ae51f14700fd # 签名
Status: Downloaded newer image for docker.io/mysql:latest # 真实地址
# 下⾯两条命令是⼀样的涵义
docker pull mysql
docker pull docker.io/mysql:latest
# 指定版本下载
[root@Oskari docker]# docker pull mysql:5.7
Trying to pull repository docker.io/library/mysql ...
5.7: Pulling from docker.io/library/mysql
33847f680f63: Already exists            # 核⼼⽂件共⽤
5cb67864e624: Already exists
1a2b594783f5: Already exists
b30e406dd925: Already exists
48901e306e4c: Already exists
603d2b7147fd: Already exists
802aa684c1c4: Already exists
5b5a19178915: Pull complete
f9ce7411c6e4: Pull complete
f51f6977d9b2: Pull complete
aeb6b16ce012: Pull complete
Digest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596
Status: Downloaded newer image for docker.io/mysql:5.7
[root@Oskari docker]# docker images
REPOSITORY          TAG                IMAGE ID            CREATED            SIZE
docker.io/mysql    5.7                8cf625070931        12 days ago        448 MB
docker.io/mysql    latest              c60d96bd2b77        12 days ago        514 MB
docker.io/centos    7                  8652b9f0cb4c        8 months ago        204 MB
docker rmi 删除镜像
docker rmi IMAGENAME / IMAGE ID
# 批量删除
docker rmi -f $(docker images -aq)  # 查出所有镜像id, 递归删除
容器命令
下载⼀个CentOS镜像来测试学习
docker pull centos
新建容器并启动
docker run [ARGS] IMAGENAME
# 参数说明
--name="NAME"              # 容器别称, ⽤来区分不同容器
-d                          # 后来⽅式运⾏
-it                        # 使⽤交互⽅式运⾏,进⼊容器查看内容
-p                          # 指定容器的端⼝ -p 8080:8080
-p ip:主机端⼝:容器端⼝
-p 主机端⼝:容器端⼝(常⽤)
-
p 容器端⼝
# 测试启动并进⼊容器
[root@Oskari docker]# docker run -it centos:7 /bin/bash
[root@1df2f1c76ad1 /]# ls # 查看容器内的centos, 基础版本, 很多命令都不是完善的.
# 从容器中退出主机
[root@1df2f1c76ad1 /]# exit
[root@Oskari docker]
列出所有的运⾏的容器
# docker ps            列出正在运⾏的容器
# docker ps -a          列出当前正在运⾏的容器+历史运⾏过的容器
# docker ps -n=?        显⽰最近创建的容器  ? number  指个数
# docker ps -q          只显⽰容器的编号
[root@Oskari docker]# docker ps
CONTAINER ID        IMAGE              COMMAND            CREATED            STATUS              PORTS              NAMES [root@Oskari docker]# docker ps -a
CONTAINER ID        IMAGE              COMMAND            CREATED            STATUS                    PORTS              NAMES
1df2f1c76ad1        centos:7            "/bin/bash"        18 minutes ago      Exited (0) 8 seconds ago                      agitated_heyrovsky [root@Oskari docker]#
退出容器
exit            # 停⽌容器并退出
Ctrl+P+Q        # 保持容器运⾏并退出
删除容器
docker rm 容器id                  # 删除单个容器
docker rm 容器id 容器id            # 删除多个容器
docker rm -f $(docker ps -aq)      # 删除所有容器
docker ps -aq|xargs docker rm      # 删除所有容器
启动和停⽌容器的操作
docker start 容器id      # 启动容器
docker restart 容器id    # 重启容器
docker stop 容器id        # 停⽌当前正在运⾏的容器
docker kill 容器id        # 强制停⽌容器
常⽤其它命令
后台启动容器
# 命令 docker run -d IMAGENAME
[root@Oskari docker]# docker run -d centos
# 问题: docker ps 发现 centos 停⽌了
# 常见的坑: docker 容器使⽤后台运⾏, 就必须要有⼀个前台进程. docker发现没有应⽤, 就会⾃动停⽌
查看⽇志
# docker logs
[root@Oskari docker]# docker logs --help
Usage:  docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details        Show extra details provided to logs
-
f, --follow        Follow log output
--help          Print usage
--since string  Show logs since timestamp
--tail string    Number of lines to show from the end of the logs (default "all")
-t, --timestamps    Show timestamps
[root@Oskari docker]# docker logs -tf --tail 10 CONTAINER-ID # 查看某容器最后10条⽇志
查看容器中的进程信息
docker top CONTAINERID # 查看运⾏中的容器的进程
查看镜像的元数据
docker inspect containerid
进⼊当前正在运⾏的容器
# 容器通常设定为后台运⾏. 如果有进⼊容器的需要
[root@Oskari docker]# docker exec -it 25d00508c3f9 /bin/bash    # 通过exec进⼊容器, 并创建⼀个 /bin/bash 进程
[root@Oskari docker]# docker attach 25d00508c3f9                # 通过attach进⼊容器, 进⼊正在运⾏的进程, 并不会创建进程
容器内拷贝⽂件到宿主机上
# docker cp
# 进⼊容器, 创建要拷贝的⽂件
[root@Oskari docker]# docker ps
CONTAINER ID        IMAGE              COMMAND            CREATED            STATUS              PORTS              NAMES
ef0508f169f9        centos:7            "/bin/bash"        2 minutes ago      Up 2 minutes                            tender_darwin
[root@Oskari docker]# docker attach ef0508f169f9
[root@ef0508f169f9 home]# ls
<
[root@ef0508f169f9 home]# exit
# 退出容器, 进⼊宿主机, 可以不在意容器运⾏状态, 只要容器存在即可
[root@Oskari home]# pwd
/home
[root@Oskari home]# docker cp ef0508f169f9:/ /home
[root@Oskari home]# ls
<
[root@Oskari home]#
test file from ef0508f169f9
[root@Oskari home]#
# docker cp containerid:/path /path
# 拷贝是⼀个⼿动过程, 未来我们可以使⽤ -v 卷的技术, 做到数据⾃动同步
作业练习
Docker 安装 Nginx
搜索镜像
[root@Oskari home]# docker search nginx
拉取镜像
[root@Oskari home]# docker pull nginx
后台⽅式启动Nginx镜像并重命名
[root@Oskari home]# docker run -d --name nginx01 -p 3344:80 nginx # 3344为宿主机端⼝,80为容器内部端⼝
0095b1e54ed30f6b71da17e6e975fe4af7982b58ec6b6b5c1efe19618a374f7d
[root@Oskari home]# docker ps
CONTAINER ID        IMAGE              COMMAND                  CREATED            STATUS              PORTS                  NAMES 0095b1e54ed3        nginx              "/"  4 seconds ago      Up 2 seconds        0.0.0.0:3344->80/tcp  nginx01
端⼝暴露概念
测试环境安装结果
[root@Oskari home]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="/"&</a>.<br/>
Commercial support is available at
<a href="nginx/">nginx</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@Oskari home]#
问题: 每次改动nginx配置⽂件, 都需要进⼊容器内部, 是分⿇烦. 如果可以在容器外部提供⼀个映射路径, 达到在容器外部修改⽂件, 容器内部就可以⾃动修改? TIPS: -v 挂载卷使⽤ Docker 安装Tomcat
# 官⽅推荐命令 , 携带版本
docker run -it --rm tomcat:9.0 # 指定下载9.0版本
# 我们之前的启动都是后台, 停⽌容器之后, 容器还是可以查到.  --rm 在容器停⽌后会删除该镜像
启⽤⼀个新的tomcat容器, 别名 tomcat01, 宿主机使⽤3355映射容器的8080端⼝
docker run -d -p 3355:8080 --name tomcat01 tomcat
这⾥在宿主机中使⽤curl命令会发现 HTTP STAUS 404 , 原因: Tomcat 镜像为阉割版本
[root@Oskari home]# docker exec -it tomcat01 /bin/bash
root@8bbdd54e1ca5:/usr/local/tomcat#
# 发现问题 1. linux 命令少了, ll ⽆法使⽤.  2. webapps ⽂件夹空.  3. 阿⾥云镜像的原因,默认是最⼩的镜像,剔除不必要的所有⽂件, 保证最⼩可运⾏环境
[root@Oskari home]# docker exec -it tomcat01 /bin/bash
root@8bbdd54e1ca5:/usr/local/tomcat# ls
<  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES    bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@8bbdd54e1ca5:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@8bbdd54e1ca5:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager
root@8bbdd54e1ca5:/usr/local/tomcat#
思考问题: 以后部署项⽬流程中, 每次都需要进⼊容器调整配置⽂件, 过于⿇烦, 如何解决? TIPS: -v 挂载卷
部署 es + kibana
# es 暴露端⼝较多
# es 占⽤内存较多
# es 需要将数据放置到安全⽬录! 挂载
# 安装镜像,启动容器
[root@Oskari home]# docker run -d --name es01 -p 9200:9200 -p 9300:9300 -e "pe=single-node" elasticsearch:7.6.2
# docker stats 查看 docker 内核运⾏状态
# 测试es是否安装成功
[root@Oskari home]# curl localhost:9200
{
"name" : "0a772db1fcba",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "pFUYgLbEQWOUeVEdShsplQ",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
mysql社区版国内镜像下载
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。