1. 程式人生 > 其它 >docker: 映象和容器基本操作

docker: 映象和容器基本操作

docker

docker介紹,與傳統虛擬機器比較:

docker不需要虛擬硬體和作業系統,輕量級,佔用體積小,啟動快。

  • VMware,kvm:底層是在一個很強健的作業系統上虛擬出很多作業系統。
  • 現在使用的很多與伺服器就是通過vm或kvm虛擬化出,阿里雲,騰訊雲再使用opensatck(開源),阿里飛天等管理虛擬化的作業系統,
  • docker:程序級別隔離。在自己的阿里雲伺服器上安裝doker,本質也是隔離作業系統,隔離網路,隔離硬體,裝在虛擬機器,雲伺服器上,一個雲服務上可以跑很多的docker容器,只要伺服器一多,就能跑成倍的容器。
  • k8s:管理不同機器上的成堆容器。

docker沒有作業系統的概念,用的還是主機的作業系統,但是docker實現了隔離.

傳統方式則是在硬體層面實現。

docker架構圖

docker是一個C/S架構。

資料卷:Filesystem。假設現在mysql正在執行,那麼表放在容器中還是宿主機上,放哪都可以,但是容器如果被刪除資料庫表也會被刪除,但是docker支援將表放在宿主機上,再起容器表還在,以後專案,Redis都是放在宿主機上。

docker安裝

windows安裝

1 windows安裝(不建議你裝)http://get.daocloud.io/

烏班圖

# 0 解除安裝
sudo apt-get remove docker docker-engine docker.io containerd runc
# 1 安裝必要工具
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
# 2 安裝GPG證書
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#換成阿里雲
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 2 寫入軟體源資訊
#官方
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#換成阿里雲
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# 3 更新並安裝docker-ce
sudo apt-get -y install docker-ce
# 4 開啟docker服務
 systemctl status docker

centos上安裝(必須7.0以上)

# 6.8安裝docker,自行搜尋,升級核心版本
# docker是在linux3.1以上核心中寫出來的,在烏班圖下開發的,docker的新特性,烏班圖先看到,
# 官方建議docker執行在centos7 以上的系統

#####安裝
0 解除安裝
yum remove docker docker-common  docker-selinux docker-engine
rm -rf /var/lib/docker

1 更新yum
yum update
2 安裝需要的軟體包, yum-util 
yum install -y yum-utils device-mapper-persistent-data lvm2
3 執行(向你的yum源,增加一條記錄)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4 安裝 
yum install docker-ce

5 驗證安裝(檢視版本)
docker -v  
~]# docker -v  (19年03月12日釋出)
# 自從分了docker-ce和docker-ee以後,以年份命名版本
Docker version 19.03.12, build 48a66213fe

6 啟動docker服務
systemctl start docker

7 停止docker服務,重啟docker服務
systemctl stop docker
systemctl restart docker

8 開機啟動	
systemctl enable docker

9 檢視概要資訊
docker info(你可能寫了一個管理docker的運維平臺)

3.4 遠端倉庫

# 註冊,登入 https://hub.docker.com/
# 你可以上傳映象(類似於github),你把你製作的映象傳上去,別人可以下載使用

# 配置加速(之前去https://hub.docker.com/),阿里雲,清華,做了一個備份,配置好以後,再拉映象會去國內地址拉取
第一步:vi /etc/docker/daemon.json  
第二步:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

4 映象操作

1 第一個hello-world(沒有任何意義)
	docker run hello-world
	1 客戶端連到服務端,服務下載了hello-world映象
    2 通過映象跑起容器來
    3 容器輸出一些東西,通過服務端傳送給客戶端,客戶端展示在窗口裡了

2 查詢映象
	方式一:https://hub.docker.com/ 點點點搜尋(你用這種)
  方式二:docker search 
3 拉取映象 
	docker pull hello-world  最新版本latest
	docker pull hello-world:nanoserver
4 檢視機器上有哪些映象
 	docker images
    REPOSITORY  TAG   IMAGE ID   CREATED   SIZE
	   映象名字    版本     id號     建立時間   大小
      
5 刪除映象
	docker rmi 映象名字/id號(# 如果還有基於這個映象的容器,是不允許刪除映象的,先刪除容器,再刪除images)
    
6 拉取python3.6映象,redis最新映象,mysql5.7映象
    docker pull python:3.6
    docker pull redis
    docker pull mysql5.7
    docker pull centos:centos7
    
7 映象是什麼?
	-就是一堆檔案,這堆檔案通過docker跑起來,就是容器,你現在就把他當成,一個作業系統內跑了這個軟體(centos+redis)
    -假設centos7的映象跑起來,容器你就當成在你宿主機上跑了一個centos7的作業系統(可以想成跑在虛擬機器)
    
    
    
 8 補充(瞭解)
	docker image inspect 46ff56815c7c
  docker image ls
  docker image rm
    

5 容器操作

1 刪除容器
 docker rm 容器名字/容器id
    
2 啟動並執行容器
	# 通過centos:centos7映象,建立一個容器名字叫mycentos,並且把它執行起來
	docker run -di --name=mycentos centos:centos7
[root@iZuf6h25s48rokq4m2fal7Z ~]# docker run -di --name=mycentos centos:centos7
# 打印出容器的id號
	31babaf539c944da3480d8a2fb4333be8b9729d45d58517b2e7e8f62849947b2
3 檢視機器上正在執行的容器
	docker ps
4 檢視宿主機上所有的容器(包括停止的)
	docker ps -a
5 停止容器
	docker stop 容器名字/id號
6 啟動容器
	docker start 容器id/名字

容器的建立並啟動

7 容器的建立和啟動(******)
	-建立:docker create --name=xxx redis
  	# ps -A 預設一個命令,啟動這個容器就執行預設命令
    docker create --name=test-container centos:centos7 ps -A
    -啟動
    docker start test-container
    
    -容器一直執行的原因
    	-它有一條前臺程序,一直在執行
        -以後如果自己製作的映象,執行起容器,必須有個可以夯住的命令
        -如果該命令結束,該容器也就結束了
        
    -建立並啟動(run)
    -i:表示執行容器
    -t:表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端。
    -d:在run後面加上-d引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t兩個引數,建立後就會自動進去容器)。
    --name :為建立的容器命名。如果不寫,會自動分配一個名字(英文人名)
    -v:表示目錄對映關係(前者是宿主機目錄,後者是容器目錄,對映到宿主機上的目錄),可以使用多個-v做多個目錄或檔案對映。注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上。
    -p:表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映
    
    # 注意:docker run -it 並不是說進入容器內部,而是分配一個為終端,對其進行互動
    docker run -it --name=myredis redis
    	
 # 注意,docker run  映象 如果本地沒有,會先pull,再run
8 與容器互動的方式:
	第一種:docker exec -it  容器id /bin/bash
    	docker exec 容器id ls 
        exec真正的作用是在容器內執行命令
    第二種:ssh連線(容器內部裝ssh服務端)
9 退出
	exit
    
10 檔案拷貝
	-從宿主機拷貝到容器內部
    	docker cp lqz.txt 容器id:/home
    -從容器內部拷貝到宿主機
    	docker cp 容器id:/home/lqz.txt /app
        
11 目錄掛載(只能掛載目錄,掛載完畢後顯示目錄下的檔案,目的是為了刪除容器後資料不會丟失,當再次起一個容器依舊可以掛載此目錄,資料都在)
	# /home/junjie:/home--> 宿主機需要掛載的目錄/掛載到容器的某個目錄,容器中所做的增刪改同步到宿主機,一旦掛載,以後宿主機目錄內修改,同樣影響容器內部
	docker run -di --name=mycentos99 -v /home/lqz:/home centos:centos7

12.埠對映

# redis服務監聽著6379埠,6377 宿主機的6377埠對映到容器的6379埠
docker run -di -p 6377:6379 redis:latest
# 瞭解:/usr/local/bin/docker-entrypoint.sh

開啟rdm,由於容器映射了6377埠,此時連結,便可以看到在容器中設定的name

Redis資料存放與記憶體,理論上我們關閉容器重新起一個redis容器,之前的資料是不存在的,但是Redis中配置檔案配置了可以持久化儲存,所以再起一個Redis依舊可以看到資料。

13 檢視容器詳細資訊

# 在容器中檢視ip
yum install net-tools

docker inspect 容器ID
# 檢視ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)

# 輸出:
[root@iZuf6h25s48rokq4m2fal7Z opt]# docker inspect --format='{{.NetworkSettings.IPAddress}}' bc9
172.17.0.2
[root@iZuf6h25s48rokq4m2fal7Z opt]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 5620
172.17.0.3

14 連結mysql

# 在容器內部署mysql
# -e表示環境變數

docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 官方提供的
docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
        
# 在容器內部署redis
docker run -di -p 6377:6379 redis:latest
        
# 在容器內部署nginx
docker run -di --name=mynginx -p 8080:80 nginx