docker基础(一)

docker入门

docker和k8s一样基于go语言开发,为容器中的一种。

什么是容器?一般说的容器指的是linux容器,指的是一组收到资源限制、彼此相互隔离的进程。

多看官方文档:https://docs.docker.com/

安装docker-ce

docker组成:client、server、repository

学习安装版本19.03.8,centos7,内核在3.10.以上

安装

安装指引:https://docs.docker.com/engine/install/centos/,跳转get started

  1. 移除旧docker环境

     sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
     
    
  2. 设置仓库源

    sudo yum install -y yum-utils
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
  3. 安装engine

    sudo yum install docker-ce docker-ce-cli containerd.io
    

    如果安装指定版本,

    yum list docker-ce --showduplicates | sort -r 
    

    例如19.03.8,则为docker-ce-19.03.8

  4. 启动docker的daemon进程

    yum makecache fast
    systemctl start docker
    
  5. 登录docker id

    docker login
    #登录一次即可记住密码
    
  6. 运行hello-world

    docker run hello-world
    

    启动顺序:先从本地repository寻找hello-world镜像→没有则去docker hub找,找到就pull下来,启动

  7. 配置阿里镜像加速器

登录阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,将mirrors地址修改为加速器地址,每人一个。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://n6eullnk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

底层原理

docker为什么比vm快?

  1. docker有比虚拟机更少的抽象层

  2. docker直接运行在宿主机内核上,而vm需要guest os

    也就是说,vm需要加载bootfs和rootfs,docker不需要重新引导加载一个操作系统内核,只需要加载rootfs即可,所以比vm快。

img

docker常用命令

帮助命令

官方帮助文档:https://docs.docker.com/engine/reference/run/

docker $cmd --help
docker version
docker info

镜像命令

#show
docker images -a #显示所有镜像
docker images -aq #只显示镜像id
#search
docker search mysql --filter=STARS=1000
#download
docker pull 镜像名[:tag] 
[root@master docker]# docker pull mysql:5.7  
5.7: Pulling from library/mysql
a10c77af2613: Pull complete   #层级下载,docker images的核心 联合文件系统
b76a7eb51ffd: Pull complete 
258223f927e4: Pull complete 
2d2c75386df9: Pull complete 
63e92e4046c9: Pull complete 
f5845c731544: Pull complete 
bd0401123a9b: Pull complete 
2724b2da64fd: Pull complete 
d10a7e9e325c: Pull complete 
1c5fd9c3683d: Pull complete 
2e35f83a12e9: Pull complete 
Digest: sha256:7a3a7b7a29e6fbff433c339fc52245435fa2c308586481f2f92ab1df239d6a29  #摘要
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
#不指定版本就是docker pull mysql相当于docker pull mysql:latest
#delete
docker rmi -f $imageid #删除指定镜像
docker rmi $(docker images -qa) #删除所有镜像

容器命令

docker pull centos

新建并启动容器、退出容器

docker run [可选参数] $image $cmd   #这里的$image可以是镜像名,也可以是镜像id
#可选参数说明
--name="centos_test"  #容器名称,用来区分容器,唯一
--it	#使用交互命令进入容器
-d		#后台方式运行
-p		#指定端口
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口
	-p 容器端口
-P		#随机端口
#例如:
[root@master docker]# docker run -it --name="centosTest" centos /bin/bash 
[root@006a8fefaa3e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@006a8fefaa3e /]# exit
exit
[root@master docker]# 
#image默认是带了latest标签,当非latest的image时,启动需要指定标签,例如:
[root@master download]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               stable              aedf7f31bdab        3 days ago          141MB
centos              latest              5d0da3dc9764        2 months ago        231MB
[root@master download]# docker run -d --name="nginx01" nginx
Unable to find image 'nginx:latest' locally
^C
[root@master download]# docker run -d --name="nginx01" nginx:stable
8c8d36840b1f4689e60d4e71ad7df968b883ec8c136c44873129b2bf3024e7e0

列出容器

docker ps #列出正在运行的容器
			 -a #列出正在运行+历史运行过的容器
			 -q #只列出容器id
             -n= #列出n个最近创建的容器

退出容器

exit #退出并停止容器,如果容器中有前台进程未结束,不会停止容器
ctrl + P + Q #退出不停止容器 

#例如:
[root@master docker]# docker exec -it a8018e7463bf /bin/sh
sh-4.4# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
sh-4.4# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 10:19 ?        00:00:08 /bin/sh -c while true;do echo hello-beauty;sleep 0.5;done
root      13944      0  0 12:17 pts/0    00:00:00 /bin/sh
root      14100      1  0 12:18 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 0.5
root      14101  13944  0 12:18 pts/0    00:00:00 ps -ef
sh-4.4# logout
sh: logout: not login shell: use `exit'
sh-4.4# exit
exit
[root@master docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a8018e7463bf        centos              "/bin/sh -c 'while t…"   2 hours ago         Up 2 hours                              centos_test1

删除容器

docker rm 容器id #正在运行的不允许删除,如要删除需要加 -f
docker rm -f $(docker ps -aq) 	 #强制删除所有容器
docker ps -aq|xargs docker rm -f #强制删除所有容器

启动和停止容器

docker start 容器id #docker run 相当于执行了docker create + docker start
docker restart 容器id
docker stop 容器id
docker kill 容器id #强制停止当前容器

docker run启动容器时,docker在后台做了啥?

  1. 检查本地是否存在指定镜像,如不存在则pull
  2. 利用镜像创建并启动一个容器,相当于docker create、docker start
  3. 分配一个rootfs文件系统,并在只读镜像层外面再挂一个读写层
  4. 从宿主机网桥接口中桥接一个虚拟接口到容器
  5. 从地址池中分配一个ip给容器
  6. 指定用户指定的应用程序
  7. 执行完毕后发现没有运行进程则停止容器

其他常用命令

后台方式运行容器

docker run -d $image

注意:如果容器运行后没有前台进程,即使用-d启动了,也不会在后台运行,会立即停止。所以上面容-d启动centos会立即退出。

[root@master docker]# docker run --name="centos_test1" -d centos /bin/sh -c "while true;do echo hello-beauty;sleep 0.5;done"
a8018e7463bf9ad8d5b7917cf18fa7032a026c4eb78c239392b4953961627716
[root@master docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a8018e7463bf        centos              "/bin/sh -c 'while t…"   7 seconds ago       Up 6 seconds                            centos_test1
docker run --rm #容器进程停止后自动删除,一般用于测试
		   -v 容器路径:docker内路径  #做路径映射
		   --restart=always #容器退出时总是重启容器,默认为no

查看容器日志

docker logs -tf --tail 条数  #类似于tail -f

例如:

[root@master docker]# docker logs -tf --tail 4 a8018e7463bf 
2021-11-20T10:22:39.601730830Z hello-beauty
2021-11-20T10:22:40.117446018Z hello-beauty
2021-11-20T10:22:40.633493993Z hello-beauty
2021-11-20T10:22:41.148728319Z hello-beauty
2021-11-20T10:22:41.664642020Z hello-beauty

查看容器中的进程信息

docker top 容器id

例如:

[root@master docker]# docker top a8018e7463bf
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                9969                9952                0                   18:19               ?                   00:00:00            /bin/sh -c while true;do echo hello-beauty;sleep 0.5;done
root                11031               9969                0                   18:25               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 0.5

查看容器信息

docker inspect 容器id
docker stats #查看容器资源使用状态

进入运行的容器

#方式一:
docker exec -it 容器id $cmd
[root@master docker]# docker exec -it a8018e7463bf /bin/sh
sh-4.4# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
#方式二:
docker attach [options] 容器id
[root@master docker]# docker attach a8018e7463bf
hello-beauty
hello-beauty
hello-beauty
hello-beauty
hello-beauty

两种方式的区别:方式一进入容器内工作目录,启动一个新的进程,方式二进入正在运行的程序的界面。

拷贝容器内文件到宿主机

docker cp 容器id:文件目录 宿主机目录
[root@master yiyu]# docker cp a8018e7463bf:/test.ss ./

练习

  1. 安装tomcat

  2. 安装nginx

  3. 安装es和kibana

    [root@master download]# docker run -d --name="elasticsearch" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 
    7b31d3bfe95989f8f5d9ce9cc0a9e878deaeed1e51bdd719079a273b6af1e988
    

课外

安装portainer可视化面板,了解即可

[root@master download]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer:portainer

docker镜像原理

iamge有层级结构,docker image inspect 镜像名最下面的layers就是它的层级。

[root@master download]# docker image inspect portainer/portainer
...
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:8dfce63a73970a18bcc2ca447d9c252aedd3157e9ee02a88e66c53571279aee9",
                "sha256:11bdf2a940a7eb35fe69359d45eaeb6f8553a682a19e26db49d4c924588bb6c4",
                "sha256:658693958bcb13c9d33a49d82f1e1297073066bec8d8b07dd49357ad5c08ce58"

docker pull下载的都是只读镜像层,docker run或者修改内容就相当于增加了一层容器层,commit后可以打包成镜像层。

提交docker镜像

docker commit -a="author" -m="desc" 镜像id 名称:标签
#运行基础镜像容器(以tomcat:9.0为例)
[root@master ~]# docker run -it --name="tomcat_local" -p 8080:8080 tomcat:9.0 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
...
22-Nov-2021 12:28:01.580 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [55] milliseconds
#进入容器,添加自定义内容
[root@master ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
0dbddcc71eb1        tomcat:9.0          "catalina.sh run"   36 seconds ago      Up 34 seconds       0.0.0.0:8080->8080/tcp  tomcat_local
[root@master ~]# docker exec -it 0dbddcc71eb1 /bin/bash 
root@0dbddcc71eb1:/usr/local/tomcat# cp webapps.dist/* webapps/ -r
root@0dbddcc71eb1:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager
#退出容器,测试,然后commit到本地repository
[root@master ~]# curl -I localhost:8080
HTTP/1.1 200 
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 22 Nov 2021 12:34:52 GMT

[root@master ~]# docker commit -a="yiyu" -m="tomcat9.0 test version for local;added webapps dic" 0dbddcc71eb1 tomcat_local:1.0 
sha256:c0855d5befbdeda543819e1b7d27a08c44642096ce54c...803a0e19f7aed
[root@master ~]# docker images 
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
tomcat_local          1.0                 c0855d5befbd        11 seconds ago      685MB
tomcat                9.0                 76206e3ba4b1        3 days ago          680MB
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值