docker基础篇--有它就够了
Linux之docker容器
一、docker是什么?
Docker 是一個開源的應用容器引擎,基于Go語言并遵從 Apache2.0 協議開源。
Docker 屬于 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。對容器進行管理。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)。
1、docker容器的框架
二、docker的安裝
官方文檔
https://docs.docker.com/engine/install/centos/
- 1.卸載原來安裝過的docker,如果沒有安裝可以不需要卸載
- 2.安裝yum相關的工具,下載docker-ce.repo文件
- 3.安裝docker-ce軟件
- 4.啟動docker服務
- 5.設置docker服務開機啟動
三、docker基本命令
1、docker系統信息與版本查看命令
a、docker --version:查看docker版本、docker info:查看詳細信息
docker info : 顯示 Docker 系統信息,包括鏡像和容器數。
[root@docker ~]# docker --version Docker version 20.10.21, build baeda1f [root@docker ~]# docker info Client:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Docker Buildx (Docker Inc., v0.9.1-docker)compose: Docker Compose (Docker Inc., v2.12.2)scan: Docker Scan (Docker Inc., v0.21.0)Server:Containers: 2Running: 2Paused: 0Stopped: 0Images: 7Server Version: 20.10.21Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueNative Overlay Diff: trueuserxattr: falseLogging Driver: json-fileCgroup Driver: cgroupfsCgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runcDefault Runtime: runcInit Binary: docker-initcontainerd version: 1c90a442489720eec95342e1789ee8a5e1b9536frunc version: v1.1.4-0-g5fd4c4dinit version: de40ad0Security Options:seccompProfile: defaultKernel Version: 3.10.0-1160.el7.x86_64Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 4Total Memory: 3.682GiBName: dockerID: NQ7B:XEPS:P3XE:FR7V:OAZA:LKSB:CAEU:YJHL:VLPT:4RW5:QZ6A:SNSRDocker Root Dir: /var/lib/dockerDebug Mode: falseRegistry: https://index.docker.io/v1/Labels:Experimental: falseInsecure Registries:127.0.0.0/8Live Restore Enabled: false2、本地鏡像管理類命令
a、docker images:查看鏡像
[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 3500a757f51d 6 days ago 473MB nginx latest 76c69feac34e 2 weeks ago 142MB redis latest c2342258f8ca 2 weeks ago 117MB python 3.9-slim f550e60adaa9 2 weeks ago 125MB mysql 5.7.39 eb175b0743cc 4 weeks ago 433MB centos latest 5d0da3dc9764 13 months ago 231MB python 2.7-slim eeb27ee6b893 2 years ago 148MBb、docker rmi : 刪除本地的一個或多個鏡像
docker rmi [OPTIONS] IMAGE [IMAGE…]
OPTIONS說明:
? -f :強制刪除;
docker rmi -f docker images -qa 表示刪除全部鏡像
[root@docker ~]# docker rmi centos Untagged: centos:latest Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b5c、docker search:查詢鏡像
[root@docker-three /]# docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos DEPRECATED; The official build of CentOS. 7422 [OK] kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 26 couchbase/centos7-systemd centos7-systemd images with additional debug… 5 [OK] dokken/centos-7 CentOS 7 image for kitchen-dokken 4name:表示鏡像名稱
description:表示鏡像說明
stars:表示點贊數量
official:是否是官方的
automated:表示是否是自動構建的。
d、docker pull : 下載鏡像
docker pull imageName
或者 docker pull imageName:tag
默認情況下,不指定版本號的話就會默認下載最新版latest
[root@docker-three /]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx a603fa5e3b41: Pull complete c39e1cda007e: Pull complete 90cfefba34d7: Pull complete a38226fb7aba: Pull complete 62583498bae6: Pull complete 9802a2cfdb8d: Pull complete Digest: sha256:e209ac2f37c70c1e0e9873a5f7231e91dcd83fdf1178d8ed36c2ec09974210ba Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest [root@docker-three /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 88736fe82739 2 weeks ago 142MB [root@docker-three /]#3、容器管理類命令
a、docker ps:看有哪些docker容器在運行
docker ps 表示列出當前正在運行的容器
docker ps -a 表示列出當前所有正在運行的容器+歷史上運行過的容器
[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0ed154462de1 nginx "/docker-entrypoint.…" 29 hours ago Up About an hour 0.0.0.0:9900->80/tcp, :::9900->80/tcp xiaowei-1-nginx [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0ed154462de1 nginx "/docker-entrypoint.…" 29 hours ago Up About an hour 0.0.0.0:9900->80/tcp, :::9900->80/tcp xiaowei-1-nginx cd5b5334aa29 nginx "/docker-entrypoint.…" 29 hours ago Exited (0) 22 seconds ago xiaowei-nginx [root@docker ~]#b、docker run :啟動容器
1. 啟動交互式容器:docker run -it 鏡像名 /bin/bash 例如: docker run -it ubuntu:14.04 /bin/bash2. 啟動后臺運行容器(或者是守護式容器):docker run -d 鏡像名 /bin/bash 上述兩個命令,并沒有給容器命名,則系統會自動分配名字。如果想要自定義容器名,則使用如下命令:docker run -it --name="容器名" 鏡像名 /bin/bash--name="容器名"-d:后臺運行容器并返回容器ID,即守護式容器-i:以交互模式運行容器,通常與-t同時使用-t:為容器重新分配一個偽輸入終端 [root@docker-three /]# docker run -it --name xiaowei-nginx bash Unable to find image 'bash:latest' locally latest: Pulling from library/bash ^C [root@docker-three /]# docker run -it --name xiaowei-nginx nginx bash root@5be5144074a8:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@5be5144074a8:/# exit [root@docker-three /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@docker-three /]# docker run -d -p 8080:80 --name xiaowei-nginx-1 nginx cce420e5de69eb9676ad034a66359962f0b1a3b57e9a7788ae73de17ab7b40d5 [root@docker-three /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cce420e5de69 nginx "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp xiaowei-nginx-1 [root@docker-three /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cce420e5de69 nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp xiaowei-nginx-1 5be5144074a8 nginx "/docker-entrypoint.…" 42 seconds ago Exited (0) 35 seconds ago xiaowei-nginx [root@docker-three /]#c、docker start : 啟動已停止運行的容器
docker start 容器名或容器ID 例如, docker start xiaowei-nginx-1d、docker restart : 重啟容器
docker restart 容器名或容器IDe、docker stop : 停止容器
docker stop 容器名或容器IDf、docker kill :強制停止容器
docker kill 容器名或容器IDg、刪除已停止的容器
docker rm 容器名或容器IDh、進入正在運行的容器
方法一:
docker exec -it 容器ID或者容器名 /bin/bash
[root@docker-three /]# docker exec -it xiaowei-nginx-1 bash root@cce420e5de69:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@cce420e5de69:/# exit [root@docker-three /]#方法二:
docker attach 容器ID或者容器名
[root@docker-three /]# docker attach xiaowei-nginx-1 attach 直接進入容器啟動命令的終端,不會啟動新的進程,用exit退出,會導致容器的停止。 exec是在容器中打開新的終端,并且可以啟動新的進程,用exit,不會導致容器的停止。 推薦使用docker exec 命令,因為退出容器終端,不會導致容器的停止。所以,一般流程是使用-d啟動容器,再用exec進入對應容器實例。i、docker top : 查看容器內運行的進程
docker top 容器ID或者容器名j、docker inspect : 查看容器內部的細節
docker inspect 容器ID或者容器名十、docker常見面試題
1、docker與虛擬機的比較
- Docker相比于傳統虛擬化方式具有的優勢和劣勢:
- 層次不一樣
虛擬機多一層封裝
2、docker的底層隔離機制
a、LXC–linux container
1.LXC是什么?
LXC是Linux containers的簡稱,是一種基于容器的操作系統層級的虛擬化技術。
2.LXC可以做什么?
LXC可以在操作系統層次上為進程提供的虛擬的執行環境,一個虛擬的執行環境就是一個容器??梢詾槿萜鹘壎ㄌ囟ǖ腸pu和memory節點,分配特定比例的cpu時間、IO時間,限制可以使用的內存大小(包括內存和是swap空間),提供device訪問控制,提供獨立的namespace(網絡、pid、ipc、mnt、uts)。
3.LXC如何實現?
Sourceforge上有LXC這個開源項目,但是LXC項目本身只是一個為用戶提供一個用戶空間的工具集,用來使用和管理LXC容器。LXC真正的實現則是靠Linux內核的相關特性,LXC項目只是對此做了整合?;谌萜鞯奶摂M化技術起源于所謂的資源容器和安全容器。
LXC在資源管理方面依賴與Linux內核的cgroups子系統,cgroups子系統是Linux內核提供的一個基于進程組的資源管理的框架,可以為特定的進程組限定可以使用的資源。LXC在隔離控制方面依賴于Linux內核的namespace特性,具體而言就是在clone時加入相應的flag(NEWNS NEWPID等等)。
4.為什么要選擇LXC?
LXC是所謂的操作系統層次的虛擬化技術,與傳統的HAL(硬件抽象層)層次的虛擬化技術相比有以下優勢:
LXC跟其他操作系統層次的虛擬化技術相比,最大的優勢在于LXC被整合進內核,不用單獨為內核打補丁。
b、Linux namespace
namespace是什么?
namespace解決了什么問題?
Linux 內核實現 namespace 的一個主要目的就是實現輕量級虛擬化(容器)服務。在同一個namespace 下的進程可以感知彼此的變化,而對外界的進程一無所知。這樣就可以讓容器中的進程產生錯覺,認為自己置身于一個獨立的系統中,從而達到隔離的目的。也就是說 linux 內核提供的 namespace 技術為 docker 等容器技術的出現和發展提供了基礎條件。
namespace有哪些?
c、Cgroup
什么是cgroup
cgroup解決了什么問題?
總結
以上是生活随笔為你收集整理的docker基础篇--有它就够了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中兴和华为的面试经历
- 下一篇: db2的驱动程序为db2jcc4-1.6