docker学习linux使用

docker配置

2023-10-08  本文已影响0人  lzj01231

一、安装docker

#加载docker-ce镜像源并安装docker
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl start docker
docker run hello-world

#配置镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://3q8h3768.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker run hello-world

二、常用命令

1.帮助启动类命令

启动docker: systemctl start docker
停止docker: systemctl stop docker
重后docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档:docker 具体命令 --help

2.镜像命令

docker images:列出本地主机上的镜像

-a:列出本地所有的镜像
-q :只显示镜像ID

docker search 某个xxx镜像名字:云端镜像查找

#--limit:只列出N个镜像,默认25个
docker search --limit 5 redis

docker pull 镜像名字:下载镜像

docker pull 某个xxx镜像名字
docker pull 镜像名字[:TAG]    #(TAG版本号,不写默认latest)

docker system df查看镜像/容器/数据卷所占的空间
docker rmi 某个xxx镜像名字ID:删除镜像

-f 强制删除
docker rmi -f 镜像ID    #删除单个
docker rmi-f 镜像名1:TAG 镜像名2:TAG    #删除多个
docker rmi -f $(docker images) -qa    #删除全部

面试题:
谈谈docker虚悬镜像是什么?
答:仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image
后续Dockerfile章节再介绍
如何查看当前机器下有多少个容器,多少个镜像?
答:docker system df

3.容器命令

①新建+启动容器:docker run [OPTIONS]IMAGE[COMMAND][ARG...]

OPTIONS说明(常用)
--name="容器新名字"
为容器指定一个名称;
-d:后台运行容器并返回容器D,也即启动守护式容器(后台运行):
-i:以交互模式运行容器,通常与t同时使用    #interactive
-t:为容器重新分配一个伪输入终端,通常与-ⅰ同时使用;也即启动交互式容器(前台有伪终端,等待交互)    #tty
-P:随机端口映射,大写P
-p:指定端口映射,小写p

②启动交互式容器(前台命令行)

docker run -it centos /bin/bash
参数说明:
-i: 交互式操作。
-t: 终端。
centos:centos 镜像。
/bin/bash: 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是/bin/bash。
要退出终端,直接输入 exit

③列出当前所有正在运行的容器:docker ps
④退出容器

exit
run进去容器,exit退出,容器停止run进去容器
ctrl+p+q退出,容器不停止

⑥启动己停止运行的容器:docker start 容器id或者容器名
⑦重启容器:docker restart 容器id或者容器名
⑧停止容器:docker stop 容器id或者容器名
⑨强制停止容器:docker kill 容器id或者容器名
⑩删除己停止的容器:docker rm 容器id或者容器名

#强制删除所有容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm

重要
①启动守护式容器(后台服务器):docker run -d redis

若使用-d开启centos会自动秒关闭,因为没有前台守护进程,redis则有

②查看容器日志:docker logs 容器id
③查看容器内运行的进程:docker top 容器
④查看容器内部细节:docker inspect 容器,可以查看容器数据卷挂载信息
⑤进入正在运行的容器并以命令行交互docker exec -it 容器ID /bash/shell
重新进入docker attach 容器ID

上述两个区别
attach 直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。
推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止

进入redis容器
docker exec-it 容器ID /bin/bash
docker exec-it 容器ID redis-cli
一般用-d后台启动的程序,再用exec进入对应容器实例

⑥从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径目的主机路径
⑦导入和导出容器:
export 导出容器的内容留作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

docker export 容器ID>文件名.tar 
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号

4.自定义镜像

1.安装自定义软件
agt-get update
apt-get -y install vim
2.封装为镜像

docker commit -m="备注内容" -a="作者" 容器id 构建的镜像名称:[标签名]

[root@lizj ~]# docker commit -m="vim cmd add ok" -a=" lizj" c1839f522391 atlizj/
sha256:741af495beca86a010862bddbcc852c4c4cc22ca2814b931095d41d2a43d8d65
3.镜像发布到阿里云容器镜像服务

命名空间>镜像仓库
① 登录阿里云Docker Registry
$ docker login --username=lzj952809310 registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。

②从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos:[镜像版本号]
③将镜像推送到Registry

$ docker login --username=lzj952809310 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos:[镜像版本号]

请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

3.构建本地私有仓库
docker pull registry
docker run -d -p 5000:5000 -v /lizjuse/myregistry/:/tmp/registry                                                                          --privileged=true registry

-v /lizjuse/myregistry/:/tmp/registry指定目录。默认情况,仓库被创建在容器的/var/lib/registry目录下建议自行用容器卷映射,方便于宿主机联调
查看当前本地仓库下的存储情况curl -XGET http://172.21.55.100:5000/v2/_catalog
复制镜像并修改名称docker tag 镜像:Tag Host:Port/Repository:Tag

[root@lizj ~]# docker tag atlizj/myubuntu:1.3 172.21.55.100:5000/myubuntu:1.3
[root@lizj ~]# docker images
REPOSITORY                                          TAG       IMAGE ID       CREATED             SIZE
172.21.55.100:5000/myubuntu                         1.3       741af495beca   About an hour ago   188MB
atlizj/myubuntu                                     1.3       741af495beca   About an hour ago   188MB
registry.cn-hangzhou.aliyuncs.com/atlizj/mycentos   1.3       741af495beca   About an hour ago   188MB

取消https限制:

[root@lizj ~]# vim /etc/docker/daemon.json
[root@lizj ~]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://3q8h3768.mirror.aliyuncs.com"],
  "insecure-registries": ["172.21.55.100:5000"]
}

上传

[root@lizj ~]# docker push 172.21.55.100:5000/myubuntu:1.3                      The push refers to repository [172.21.55.100:5000/myubuntu]
130e2e093af5: Pushed
9f54eef41275: Pushed
1.3: digest: sha256:d974a028cd47ddb69094df75e8ebfce6d70e2092600bbdd530af4b69a895de18 size: 741

[root@lizj ~]# curl -XGET http://172.21.55.100:5000/v2/_catalog
{"repositories":["myubuntu"]}

4.容器数据卷

指的是服务器指定文件夹挂载到容器中
docker run -d -p 50 0:5000 -v /lizjuse/myregistry/:/tmp/registry:ro --privileged=true --name u1 registry
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:读写权限 镜像名
容器内读写权限限制
rw:读写(默认)、ro:read only只读
Docker挂载主机目录访问如果出现cannot open directory.: Permission denied
解决办法: 在挂载目录后多加一个--privileged=true参数即可
不同容器的数据卷的继承:docker run -it --privileged=true -- volumes- from u1 --name u2 ubuntu

三、理论知识

1.解析hello-world镜像运行

[root@lizj ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

步骤如下:
1.查找是否有hello-world镜像,无则下载,有则运行为容器
2.运行结束后关闭hello-world镜像容器


2.容器比虚拟化快的原因

(1)docker有着比虚拟机更少的抽象层

由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源因此在CPU、内存利用率上docker将会在效率上有明显优势。

(2)docker利用的是宿主机的内核,而不需要加载操作系统OS内核

当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程.因此新建一个docker突器只需要几秒钟。


3.镜像

①UnionFS(联合文件系统):分层、轻量、可聚合的镜像基础,支持对文件系统的修改作为一次叠加来一层层提交。
②镜像加载原理:一层层的文件系统组成(UnionFS)
docker镜像层只是可读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层(rootfs)”

4.面试题

①谈谈docker虚悬镜像是什么?
答:仓库名、标签都是<none>的镜像,俗称虚悬镜像dangling image
②如何查看当前机器下有多少个容器,多少个镜像?
答:docker system df
③进入真正在运行的容器的两种方式是什么?区别是什么?一般用哪个?
答:docker exec -it 容器ID /bash/shelldocker attach 容器ID
attach 直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止。
exec 是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。
推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。

上一篇下一篇

猜你喜欢

热点阅读