docker是什么?
? 我發現很多初學者,包括我也初學不久,也是聽到這樣的模棱兩可的概念,docker是容器,久而久之,還沒學的時候,可能冉升出更奇妙的思想,把docker當成了服務器的角色,我有個朋友,前兩天剛安裝docker,想部署專案以docker的形式,就想著docker是一個大容器,往里面先布置環境,裝個jdk8,再往里面裝mysql等等,其實思路一下子就岔開了,雖然專案的運行需要這些組件,但是docker的思想肯定不是這樣的,這樣就相當于一臺服務器無異了,那還要docker干什么是吧,
? 按照個人理解,或者官方來說,docker是一種容器引擎,本身不是一個大容器,它包括三個大的內容:鏡像(image);容器(container);倉庫(repository),這三個具體下面在具體介紹,先來了解為什么會出現docker這種組件,它的出現為了解決什么問題,了解了這個我覺得才對它有熟悉的定位,學一門技術,我在其他博主那里看到葵花寶典,現在我自己學新技術也是,必須先了解它,再考慮怎么使用,
寫代碼的四點:
1.明確需求,要做什么?
2.分析思路,要怎么做?(1,2,3……)
3.確定步驟,每一個思路要用到哪些陳述句、方法和物件,
4.代碼實作,用具體的語言代碼將思路實作出來,
學習新技術的四點:
1.該技術是什么?
2.該技術有什么特點?(使用需注意的方面)
3.該技術怎么使用?(寫Demo)
4.該技術什么時候用?(在Project中的使用場景 )
為什么會出現docker?
? 專案一般都有開發–運維兩個角色,當然小公司可能都是一個人在干(比如我),可能會嘗嘗聽到這樣的對話“我本地沒問題的,怎么到你那就不行了”,或者“怎么本地測驗可以,一部署線上就不行了”,“windows測驗都沒問題的,到了linux就不行了”等等,
? 其實不管是運維跟開發溝通也好,自己包攬也罷,都會出現這樣的問題,這里面包括很多,從我的電腦搬到你的或者線上,要配置環境,配置應用,jdk、redis集群、nginx、ES、Hadoop、mysql,windows跨平臺等等,都得先部署好,我在公司就部署過老專案,還是前后端一體的,換了個服務器,去上面裝環境等等,裝tomcat,打包成war包,放到webapp下面,最后直接啟動,還好CRT-linux連接工具不會顯示紅色,不然簡直血流成河,很多東西一部署到線上就不行了,其中配置等等問題在里面,
? 所以docker就是能解決這些問題的玩意~~真香警告,我剛學了這么段時間,簡直愛不釋手,docker可以做到把環境跟專案和配置等一起打包成一個鏡像,然后上傳到倉庫,這時候別人去倉庫上拉取(就類似于GIT),直接運行即可,高度還原場景,前面的對話基本一掃而空,其實除了打包專案,還有很多組件鏡像源,像我搭建mq服務,直接下載docker鏡像源啟動,唉,真香,
? docker的思想就來自于集裝箱!
? JRE - 多個應用(埠沖突)- 原來都是交叉的!
? docker通過隔離沙箱機制,可以將服務器利用到極致!
docker的基本組成
鏡像(image):
? 這玩意就像你裝雙系統,或者你用vm的時候,也需要一個鏡像,可以通過這個鏡像來創建容器服務,比如tomcat鏡像==>run==>容器(提供服務器),通過鏡像可以創建多個容器(最終服務運行或者專案運行就是在這個容器中的),可以直接到遠程倉庫search各種鏡像,centos、ubuntu、rabbitmq、mysql等等,搭建起來簡單快捷,總之香~
容器(container):
? docker容器技術,通過鏡像來創建一個或者一組容器,啟動、停止、洗掉、等命令,每個容器都是獨立的服務,互不干擾,集裝箱思想、目前可以把這個容器理解為一個簡易的Linux系統,
倉庫(repository):
? 倉庫就是存放鏡像的地方,有公有私有,跟git類似
? docker hub是國外的,阿里云等都有容器服務器(可以配置鏡像加速器!)
Docker跟虛擬機的區別:
- 體積小,如果虛擬機裝個ubuntu鏡像,可能是十幾個G甚至更大,而docker版本只需要90M不到~
- 資源占用小,虛擬機會獨占一部分記憶體和磁盤空間,它運行的時候,其他應用就不能用這些資源,就算虛擬機里面只有1m的東西在跑,也需要幾百m的記憶體運行,docker容器只占用需要的資源,不占用那些沒有用到的資源,另外,多個容器可以共享資源,虛擬機都是獨享資源,
- 啟動速度快,虛擬機啟動,用過的都知道~跟你電腦開機差不多,啟動一個作業系統時間,有時幾分鐘,docker容器的底層就是相當于啟動本機的一個行程,速度非常快,
- 隔離,虛擬就需要隔離幾個應用,就要創建多個虛擬機,消耗大量的記憶體和CPU,一般人的電腦可頂不住,docker守護行程可以直接與主作業系統進行通信,為各個docker容器分配資源,還可以將容器與主作業系統隔離,并將各個容器互相隔離,集裝箱思想,
Docker的安裝
1、Linux要求內核3.0以上
2、centos 7
我的是ubuntu18

安裝:
幫助檔案:https://docs.docker.com/engine/install/
或者:https://www.runoob.com/docker/ubuntu-docker-install.html
可以使用官方的安裝腳本自動安裝:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用國內的daocloud一鍵安裝命令:
curl -sSL https://get.daocloud.io/docker | sh
手動安裝參照上面鏈接,安裝完之后使用查看版本命令或者嘗試下載鏡像,測驗安裝成功

下載鏡像測驗:


看到hello-world說明鏡像下載成功了,
配置阿里云鏡像加速器:
? 我覺得對于學生,或者跟我這樣剛作業沒多久的,買一個自己的云服務器是很有幫助的,任何事情都在自己的服務器上操作一遍實體,無論是增強記憶性,還是對于自己學習理解,都是很有幫助的,實踐才是硬道理,阿里云新用戶專享99一年,1核2G的,用來學習,做demo完全ok的,

配置加速:
? 在阿里云的管理平臺找到容器與鏡像服務,點鏡像加速器,有指令介紹的,

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://9ojmf3wg.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
到此,docker就算配置好了,下面介紹一下常用命令
常用命令:
幫助命令:
docker -v #查看版本
docker -info #顯示docker的系統資訊
docker <命令> --help #查看某個命令的幫助檔案
鏡像命令:
docker images #查看已經下載的鏡像串列
docker search ..#去鏡像倉庫搜索對應鏡像源
docker pull ..#下載鏡像
docker rmi <id> #洗掉鏡像(洗掉鏡像前得保證該鏡像沒有創建的容器保存,否則提示先去洗掉容器)



容器命令:
docker pull #下載鏡像
docker run #新建容器并啟動
docker ps #查看正在運行的容器串列,-a查看所有容器串列包括停止運行的
docker stop <id> #停止容器
docker start <id> #運行容器
docker restart <id> #重啟容器
docker rm <id> #洗掉容器



關于RUN方法的流程圖:

常用的其他命令:
docker cp 容器id:容器內路徑 主機目的路徑 #檔案拷貝到本地
docker exec -it 容器id /bin/bash #進入容器內部
docker attach 容器id #進入容器內部
#兩個進入容器內部命令的區別,exec:開啟新的終端,進去操作,attach:進入正在運行的終端操作
docker inspect 容器id #查看鏡像的元資料
docker login #登錄遠程倉
docker push #推送到遠程倉
docker pull #從遠程倉下拉
docker commit #打包鏡像(一般現在都用dockerfile)
#文章末尾附上命令葵花寶典
登錄dockerHub,推送跟下拉鏡像:
1、先去dockerHub上面注冊賬號:

2、創建一個倉庫:

3、在服務器上登錄遠程倉,需要輸入賬號密碼,succeed代表成功

4、push鏡像到遠程倉庫
5、pull遠程倉的鏡像到本地
使用docker版rabbitmq實體
1、下載并啟動rabbitmq(直接用run指令,前面有流程圖說明)

-d 表示后臺啟動,–name 別稱,-p 是埠映射(宿主機埠:容器埠) 最后是鏡像源名稱:版本標簽,rabbitmq默認埠是5672,15672,這邊映射到服務器的5673以及15673埠,如果是在阿里云服務端操作的,要去設立安全組開放埠,



ok,設定好之后,linux系統開放防火墻埠的指令也可以記住一下:
firewall-cmd --zone=public --add-port=8010/tcp --permanent #開放8010埠
systemctl restart firewalld.service #重啟防火墻
#如果開放失敗,先檢查防火墻是否啟動
這樣,docker版本的rabbitmq就已經部署好了,是不是很簡單,真香警告,我們可以測驗一下

我們可以通過阿里云ip訪問rabbitmq管理平臺測驗下是否正常

登錄進去看看管理平臺,這里測驗可能就需要一些rabbitmq的demo知識,網上很多,推薦一個:

推薦的rabbitmq測驗demo:https://blog.csdn.net/wjg8209/article/details/107203082,我們跳過他的安裝,直接到測驗代碼,交換方式有很多種,我這也列出一種topic形式的交換方式,出處找到了,我做了些標注,https://blog.csdn.net/a745233700/article/details/89681801:
提供者代碼:
package com.upload.util;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class SentTopic {
private static final String EXCHANGE_NAME = "topic_logs";
/**
* MQdemo TOPIC路由型別方式,可以指定任意路由鍵發送訊息 https://blog.csdn.net/a745233700/article/details/89681801
* @author yxb
* @param args
*/
public static void main(String[] args) {
Connection connection = null;
Channel channel = null;
try {
//建立連接和通道
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("");//你的服務器ip
//factory.setHost("");
factory.setPort(5673);
connection = factory.newConnection();
channel = connection.createChannel();
//宣告路由器和路由器型別
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
//定義路由鍵和訊息
String routingKey = "cron.critical";//可以設定特定的任意路由鍵,接收方指定路由鍵接收特定訊息
String message = "A critical cron error";
//發布訊息
channel.basicPublish(EXCHANGE_NAME,routingKey,null,message.getBytes("UTF-8"));
System.out.println("sent message -- "+routingKey+":"+message);
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e){
e.printStackTrace();
}finally {
if (connection!=null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
消費者代碼:
package com.upload.util;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class RecvTopic {
private static final String EXCHANGE_NAME = "topic_logs";
/**
* MQdemo TOPIC路由型別方式,可以指定任意路由鍵接收訊息 https://blog.csdn.net/a745233700/article/details/89681801
* @author yxb
* @param args
*/
public static void main(String[] args) throws IOException, TimeoutException {
//建立連接和通道
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("");//你的服務器ip
//factory.setHost("");
factory.setPort(5673);
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//宣告路由器和路由器型別
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
String queueName = channel.queueDeclare().getQueue();
//指定接收某類路由鍵的資訊
String bingingKeys[]={"*.critical","kern.*"};//指定路由鍵接收特定的某些指令資訊,#代表接收所有的資訊,可指定多個{"1","2"}
for (String bindingKey : bingingKeys){
channel.queueBind(queueName,EXCHANGE_NAME,bindingKey);
}
System.out.println("waiting for messages . To exit press CTRL + C");
System.out.println("接收端正在等待訊息...");
//監聽訊息
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body,"UTF-8");
System.out.println("接收到的訊息/recvTopic message--"+envelope.getRoutingKey()+":"+message);
}
};
channel.basicConsume(queueName,true,consumer);
}
}
我跑起來測驗一下:
我先跑起來消費者,監聽佇列資訊:

我們到rabbitmq管理平臺看看:

可以看到我們有一個連接數,一條通道,一個佇列,一個消費者,說明我們消費者監聽佇列成功,我們再測驗提供者發送訊息能否給消費者監聽到:


到此,簡單的rabbitmq服務就運作起來了,所以說,使用docker除了打包發布等,專案中使用到很多類似組件也是很方便部署安裝跟呼叫,redis、mysql、nginx等等,都可以仿照這種方式部署,很香的,
學到這,基本上就可以算docker入門級別了,因為這些都是基礎知識,只能說明你了解docker,會簡單應用了,但企業用起來還有幾個關鍵知識,學會了才算剛畢業,大神說的,我也是小小學者hhhhhhh,但我實踐了才會總結,敲熟了才好說話,
后面還有一些知識學完就差不多了,可以說這才是重點:
- 容器資料卷
- docker網路原理
- IDEA整合docker
- dockerfile
- docker Compose
- docker Swarm
差不多就這些,我也沒學完哈哈哈哈,我是邊學邊敲邊分享的,學了一大部分了,快完結了,但是到這里是一個節點吧,最后先附上一段怎么把springboot專案打包成一個docker鏡像,別人一拿到這個鏡像就可以跑起你的專案,無需再部署任何環境配置,這玩意比較吸引人吧hhhh,
前提準備:
- 安裝好docker
- 測驗過任何一個demo,類似于上面的mq,這些玩意真的是要自己實操的,不然學起來我自己感覺我賊沒勁,搞不好一段時間就忘記了,
- 準備好一個跑得動的springboot專案,測驗的話,簡簡單單就行,寫個controller也行,你有現成的專案也行,
1、打包專案jar包

2、撰寫Dockerfile
這里可以下載一個idea插件,可以高亮,也可以連接遠程等

撰寫Dockerfile:

3、上傳到服務器,撰寫好之后上傳jar包跟Dockerfile到服務器

4、創建鏡像命令


docker build -t yxb666 . #創建鏡像命令,注意末尾有個“.”
5、我們跑起來!

docker run -d --name yxb6666 -p 8080:8080 yxb666:latest
6、postman測驗

測驗介面成功!!!說明我們已經打包好了專案為一個docker鏡像,測驗結束,完美,,,
就先到這把,進階版的,我悟透了,敲熟悉了再分享一下,如果有人覺得上面很多內容熟悉,沒錯!!!!!!
我也是學別人的,給大家推薦up主,狂神說java!!!公眾號搜索《狂神說》
b站搜索“狂神說java”有很多視頻,我覺得是很好的,我學的最舒服的一個
總之,實踐才是最重要的!!!!!動手最關鍵
等我更新,贊一下的人最牛逼了,漲薪翻倍,可以關注狂神,也順帶關注我這樣子,hhhh…
寶典:
docker 常用命令:
attach Attach local standard input, output, and error streams to a running container #當前shell下 attach連接指定運行的鏡像
build Build an image from a Dockerfile # 通過Dockerfile定制鏡像
commit Create a new image from a container’s changes #提交當前容器為新的鏡像
cp Copy files/folders between a container and the local filesystem #拷貝檔案
create Create a new container #創建一個新的容器
diff Inspect changes to files or directories on a container’s filesystem #查看docker容器的變化
events Get real time events from the server # 從服務獲取容器實時時間
exec Run a command in a running container # 在運行中的容器上運行命令
export Export a container’s filesystem as a tar archive #匯出容器檔案系統作為一個tar歸檔檔案[對應import]
history Show the history of an image # 展示一個鏡像形成歷史
images List images #列出系統當前的鏡像
import Import the contents from a tarball to create a filesystem image #從tar包中匯入內容創建一個檔案系統鏡像
info Display system-wide information # 顯示全系統資訊
inspect Return low-level information on Docker objects #查看容器詳細資訊
kill Kill one or more running containers # kill指定docker容器
load Load an image from a tar archive or STDIN #從一個tar包或標準輸入中加載一個鏡像[對應save]
login Log in to a Docker registry #登錄到Docker遠程倉庫
logout Log out from a Docker registry #從Docker遠程倉庫注銷
logs Fetch the logs of a container #獲取容器的日志
pause Pause all processes within one or more containers #暫停一個或多個容器中的所有行程
port List port mappings or a specific mapping for the container #列出容器的埠映射或特定映射
ps List containers #串列容器
pull Pull an image or a repository from a registry #從遠程倉庫中提取影像或存盤庫
push Push an image or a repository to a registry #將影像或存盤庫推到遠程倉庫
rename Rename a container #重命名一個容器
restart Restart one or more containers #重新啟動一個或多個容器
rm Remove one or more containers #洗掉一個或多個容器
rmi Remove one or more images #洗掉一個或多個鏡像
run Run a command in a new container #啟動一個新容器
save Save one or more images to a tar archive (streamed to STDOUT by default) #將一個或多個鏡像保存到tar歸檔檔案(默認情況下流化到STDOUT)將一個或多個影像保存到tar歸檔檔案(默認情況下流化到STDOUT)
search Search the Docker Hub for images #在Docker Hub中搜索鏡像
start Start one or more stopped containers #啟動一個或多個已停止的容器
stats Display a live stream of container(s) resource usage statistics #顯示容器資源使用統計資料的實時流
stop Stop one or more running containers #停止一個或多個正在運行的容器
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE #創建一個參考SOURCE_IMAGE的標記TARGET_IMAGE
top Display the running processes of a container #顯示容器正在運行的行程
unpause Unpause all processes within one or more containers #在一個或多個容器中取消暫停所有行程
update Update configuration of one or more containers #更新一個或多個容器的配置
version Show the Docker version information #顯示Docker版本資訊
a live stream of container(s) resource usage statistics #顯示容器資源使用統計資料的實時流
stop Stop one or more running containers #停止一個或多個正在運行的容器
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE #創建一個參考SOURCE_IMAGE的標記TARGET_IMAGE
top Display the running processes of a container #顯示容器正在運行的行程
unpause Unpause all processes within one or more containers #在一個或多個容器中取消暫停所有行程
update Update configuration of one or more containers #更新一個或多個容器的配置
version Show the Docker version information #顯示Docker版本資訊
wait Block until one or more containers stop, then print their exit codes #阻塞直到一個或多個容器停止,然后列印它們的退出代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/203718.html
標籤:其他
