環境資訊中心綜合外電;姜唯 編譯;林大利 審校
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※想知道最厲害的網頁設計公司"嚨底家"!
※別再煩惱如何寫文案,掌握八大原則!
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※回頭車貨運收費標準
※台中搬家公司費用怎麼算?
ThreadLocal是線程變量,ThreadLocal中填充的變量屬於當前線程,該變量對其他線程而言是隔離的。ThreadLocal為變量在每個線程中都創建了一個副本,那麼每個線程可以訪問自己內部的副本變量。
它具有3個特性:
在不使用ThreadLocal的情況下,變量不隔離,得到的結果具有隨機性。
public class Demo { private String variable; public String getVariable() { return variable; } public void setVariable(String variable) { this.variable = variable; } public static void main(String[] args) { Demo demo = new Demo(); for (int i = 0; i < 5; i++) { new Thread(()->{ demo.setVariable(Thread.currentThread().getName()); System.out.println(Thread.currentThread().getName()+" "+demo.getVariable()); }).start(); } } }
輸出結果:
Thread-2 Thread-2 Thread-4 Thread-4 Thread-1 Thread-2 Thread-0 Thread-2 Thread-3 Thread-3
View Code
在不使用ThreadLocal的情況下,變量隔離,每個線程有自己專屬的本地變量variable,線程綁定了自己的variable,只對自己綁定的變量進行讀寫操作。
public class Demo { private ThreadLocal<String> variable = new ThreadLocal<>(); public String getVariable() { return variable.get(); } public void setVariable(String variable) { this.variable.set(variable); } public static void main(String[] args) { Demo demo = new Demo(); for (int i = 0; i < 5; i++) { new Thread(()->{ demo.setVariable(Thread.currentThread().getName()); System.out.println(Thread.currentThread().getName()+" "+demo.getVariable()); }).start(); } } }
輸出結果:
Thread-0 Thread-0 Thread-1 Thread-1 Thread-2 Thread-2 Thread-3 Thread-3 Thread-4 Thread-4
View Code
上述需求,通過synchronized加鎖同樣也能實現。但是加鎖對性能和併發性有一定的影響,線程訪問變量只能排隊等候依次操作。TreadLocal不加鎖,多個線程可以併發對變量進行操作。
public class Demo { private String variable; public String getVariable() { return variable; } public void setVariable(String variable) { this.variable = variable; } public static void main(String[] args) { Demo demo = new Demo1(); for (int i = 0; i < 5; i++) { new Thread(()->{ synchronized (Demo.class){ demo.setVariable(Thread.currentThread().getName()); System.out.println(Thread.currentThread().getName()+" "+demo.getVariable()); } }).start(); } } }
ThreadLocal和synchronized都是用於處理多線程併發訪問資源的問題。ThreadLocal是以空間換時間的思路,每個線程都擁有一份變量的拷貝,從而實現變量隔離,互相不干擾。關注的重點是線程之間數據的相互隔離關係。synchronized是以時間換空間的思路,只提供一個變量,線程只能通過排隊訪問。關注的是線程之間訪問資源的同步性。ThreadLocal可以帶來更好的併發性,在多線程、高併發的環境中更為合適一些。
JDBC對於事務原子性的控制可以通過setAutoCommit(false)設置為事務手動提交,成功后commit,失敗后rollback。在多線程的場景下,在service層開啟事務時用的connection和在dao層訪問數據庫的connection應該要保持一致,所以併發時,線程只能隔離操作自已的connection。
解決方案1:service層的connection對象作為參數傳遞給dao層使用,事務操作放在同步代碼塊中。
存在問題:傳參提高了代碼的耦合程度,加鎖降低了程序的性能。
解決方案2:當需要獲取connection對象的時候,通過ThreadLocal對象的get方法直接獲取當前線程綁定的連接對象使用,如果連接對象是空的,則去連接池獲取連接,並通過ThreadLocal對象的set方法綁定到當前線程。使用完之後調用ThreadLocal對象的remove方法解綁連接對象。
ThreadLocal的優勢:
每個ThreadLocal維護一個ThreadLocalMap,Map的Key是ThreadLocal實例本身,value是要存儲的值。
每個線程內部都有一個ThreadLocalMap,Map裏面存放的是ThreadLocal對象和線程的變量副本。Thread內部的Map通過ThreadLocal對象來維護,向map獲取和設置變量副本的值。不同的線程,每次獲取變量值時,只能獲取自己對象的副本的值。實現了線程之間的數據隔離。
JDK1.8的設計相比於之前的設計(通過ThreadMap維護了多個線程和線程變量的對應關係,key是Thread對象,value是線程變量)的好處在於,每個Map存儲的Entry數量變少了,線程越多鍵值對越多。現在的鍵值對的數量是由ThreadLocal的數量決定的,一般情況下ThreadLocal的數量少於線程的數量,而且並不是每個線程都需要創建ThreadLocal變量。當Thread銷毀時,ThreadLocal也會隨之銷毀,減少了內存的使用,之前的方案中線程銷毀后,ThreadLocalMap仍然存在。
首先獲取線程,然後獲取線程的Map。如果Map不為空則將當前ThreadLocal的引用作為key設置到Map中。如果Map為空,則創建一個Map並設置初始值。
首先獲取當前線程,然後獲取Map。如果Map不為空,則Map根據ThreadLocal的引用來獲取Entry,如果Entry不為空,則獲取到value值,返回。如果Map為空或者Entry為空,則初始化並獲取初始值value,然後用ThreadLocal引用和value作為key和value創建一個新的Map。
刪除當前線程中保存的ThreadLocal對應的實體entry。
該方法的第一次調用發生在當線程通過get方法訪問線程的ThreadLocal值時。除非線程先調用了set方法,在這種情況下,initialValue才不會被這個線程調用。每個線程最多調用依次這個方法。
該方法只返回一個null,如果想要線程變量有初始值需要通過子類繼承ThreadLocal的方式去重寫此方法,通常可以通過匿名內部類的方式實現。這個方法是protected修飾的,是為了讓子類覆蓋而設計的。
ThreadLocalMap是ThreadLocal的靜態內部類,沒有實現Map接口,獨立實現了Map的功能,內部的Entry也是獨立實現的。
與HashMap類似,初始容量默認是16,初始容量必須是2的整數冪。通過Entry類的數據table存放數據。size是存放的數量,threshold是擴容閾值。
Entry繼承自WeakReference,key是弱引用,其目的是將ThreadLocal對象的生命周期和線程生命周期解綁。
內存溢出:沒有足夠的內存供申請者提供
內存泄漏:程序中已動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等驗證后溝。內存泄漏的堆積會導致內存溢出。
弱引用:垃圾回收器一旦發現了弱引用的對象,不管內存是否足夠,都會回收它的內存。
內存泄漏的根源是ThreadLocalMap和Thread的生命周期是一樣長的。
如果在ThreadLocalMap的key使用強引用還是無法完全避免內存泄漏,ThreadLocal使用完后,ThreadLocal Reference被回收,但是Map的Entry強引用了ThreadLocal,ThreadLocal就無法被回收,因為強引用鏈的存在,Entry無法被回收,最後會內存泄漏。
在實際情況中,ThreadLocalMap中使用的key為ThreadLocal的弱引用,value是強引用。如果ThreadLocal沒有被外部強引用的話,在垃圾回收的時候,key會被清理,value不會。這樣ThreadLocalMap就出現了為null的Entry。如果不做任何措施,value永遠不會被GC回收,就會產生內存泄漏。
ThreadLocalMap中考慮到這個情況,在set、get、remove操作后,會清理掉key為null的記錄(將value也置為null)。使用完ThreadLocal后最後手動調用remove方法(刪除Entry)。
也就是說,使用完ThreadLocal后,線程仍然運行,如果忘記調用remove方法,弱引用比強引用可以多一層保障,弱引用的ThreadLocal會被回收,對應的value會在下一次ThreadLocalMap調用get、set、remove方法的時候被清除,從而避免了內存泄漏。
構造函數創建一個長隊為16的Entry數組,然後計算firstKey的索引,存儲到table中,設置size和threshold。
firstKey.threadLocalHashCode & (INITIAL_CAPACITY-1)用來計算索引,nextHashCode是Atomicinteger類型的,Atomicinteger類是提供原子操作的Integer類,通過線程安全的方式來加減,適合高併發使用。
每次在當前值上加上一個HASH_INCREMENT值,這個值和斐波拉契數列有關,主要目的是為了讓哈希碼可以均勻的分佈在2的n次方的數組裡,從而盡量的避免衝突。
當size為2的冪次的時候,hashCode & (size – 1)相當於取模運算hashCode % size,位運算比取模更高效一些。為了使用這種取模運算, 所有size必須是2的冪次。這樣一來,在保證索引不越界的情況下,減少衝突的次數。
ThreadLocalMao使用了線性探測法來解決衝突。線性探測法探測下一個地址,找到空的地址則插入,若整個空間都沒有空餘地址,則產生溢出。例如:長度為8的數組中,當前key的hash值是6,6的位置已經被佔用了,則hash值加一,尋找7的位置,7的位置也被佔用了,回到0的位置。直到可以插入為止,可以將這個數組看成一個環形數組。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※教你寫出一流的銷售文案?
※超省錢租車方案
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※回頭車貨運收費標準
在操作系統中,安裝了多個程序,併發指的是在一段時間內宏觀上有多個程序同時運行,這在單 CPU 系統中,每一時刻只能有一道程序執行,即微觀上這些程序是分時的交替運行,只不過是給人的感覺是同時運行,那是因為分時交替運行的時間是非常短的。
而在多個 CPU 系統中,則這些可以併發執行的程序便可以分配到多個處理器上(CPU),實現多任務并行執行,即利用每個處理器來處理一個可以併發執行的程序,這樣多個程序便可以同時執行。目前電腦市場上說的多核 CPU,便是多核處理器,核 越多,并行處理的程序越多,能大大的提高電腦運行的效率。
單核處理器的計算機肯定是不能并行的處理多個任務的,只能是多個任務在單個CPU上併發運行。同理,線程也是一樣的,從宏觀角度上理解線程是并行運行的,但是從微觀角度上分析卻是串行運行的,即一個線程一個線程的去運行,當系統只有一個CPU時,線程會以某種順序執行多個線程,我們把這種情況稱之為線程調度。
操作系統調度的最小任務單位是線程。常用的Windows、Linux等操作系統都採用搶佔式多任務,如何調度線程完全由操作系統決定,程序自己不能決定什麼時候執行,以及執行多長時間。
每個進程都有自己的地址空間,即進程空間,在網絡或多用戶換機下,一個服務器通常需要接收大量不確定數量用戶的併發請求,為每一個請求都創建一個進程顯然行不通(系統開銷大響應用戶請求效率低),因此操作系統中線程概念被引進。線程的改變只代表CPU的執行過程的改變,而沒有發生進程所擁有的資源的變化。
線程執行開銷小,但是不利於資源的管理和保護。線程適合在SMP機器(雙CPU系統)上運行。進程執行開銷大,但是能夠很好的進行資源管理和保護。進程可以跨機器前移。
對資源的管理和保護要求高,不限制開銷和效率時,使用多進程。
要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多線程。
線程共包括以下5種狀態,也叫生命周期。
1. 新建狀態(New) :線程對象被創建后,就進入了新建狀態。例如,Thread thread = new Thread()。
2. 就緒狀態(Runnable):也被稱為“可執行狀態”。線程對象被創建后,其它線程調用了該對象的start()方法,從而來啟動該線程。例如,thread.start()。處於就緒狀態的線程,隨時可能被CPU調度執行。
3. 運行狀態(Running) :線程獲取CPU權限進行執行。需要注意的是,線程只能從就緒狀態進入到運行狀態。
4. 阻塞狀態(Blocked) :阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:
① 等待阻塞 — 通過調用線程的wait()方法,讓線程等待某工作的完成。
② 同步阻塞 — 線程在獲取 synchronized 同步鎖失敗(因為鎖被其它線程所佔用),它會進入同步阻塞狀態。
③ 其他阻塞 — 通過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5. 死亡狀態(Dead) :線程執行完了或者因異常退出了run()方法,該線程結束生命周期。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※別再煩惱如何寫文案,掌握八大原則!
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※超省錢租車方案
※教你寫出一流的銷售文案?
※網頁設計最專業,超強功能平台可客製化
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※台中搬家遵守搬運三大原則,讓您的家具不再被破壞!
在之前的Spring版本中,我們只能通過寫XML配置文件來定義我們的Bean,XML配置不僅繁瑣,而且很容易出錯,稍有不慎就會導致編寫的應用程序各種報錯,排查半天,發現是XML文件配置不對!另外,每個項目編寫大量的XML文件來配置Spring,也大大增加了項目維護的複雜度,往往很多個項目的Spring XML文件的配置大部分是相同的,只有很少量的配置不同,這也造成了配置文件上的冗餘。
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation
在Spring容器的底層,最重要的功能就是IOC和DI,也就是控制反轉和依賴注入。
IOC:控制反轉,將類的對象的創建交給Spring類管理創建。
DI:依賴注入,將類裏面的屬性在創建類的過程中給屬性賦值。
DI和IOC的關係:DI不能單獨存在,DI需要在IOC的基礎上來完成。
在Spring內部,所有的組件都會放到IOC容器中,組件之間的關係通過IOC容器來自動裝配,也就是我們所說的依賴注入。接下來,我們就使用註解的方式來完成容器組件的註冊、管理及依賴、注入等功能。
在介紹使用註解完成容器組件的註冊、管理及依賴、注入等功能之前,我們先來看看使用XML文件是如何注入Bean的。
首先,我們在工程的io.mykit.spring.bean包下創建Person類,作為測試的JavaBean,代碼如下所示。
package io.mykit.spring.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
/**
* @author binghe
* @version 1.0.0
* @description 測試實體類
*/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable {
private static final long serialVersionUID = 7387479910468805194L;
private String name;
private Integer age;
}
接下來,我們在工程的resources目錄下創建Spring的配置文件beans.xml,通過beans.xml文件將Person類注入到Spring的IOC容器中,配置如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id = "person" class="io.mykit.spring.bean.Person">
<property name="name" value="binghe"></property>
<property name="age" value="18"></property>
</bean>
</beans>
到此,我們使用XML方式注入JavaBean就配置完成了。接下來,我們創建一個SpringBeanTest類來進行測試,這裏,我使用的是Junit進行測試,測試方法如下所示。
@Test
public void testXmlConfig(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = (Person) context.getBean("person");
System.out.println(person);
}
運行testXmlConfig()方法,輸出的結果信息如下。
Person(name=binghe, age=18)
從輸出結果中,我們可以看出,Person類通過beans.xml文件的配置,已經注入到Spring的IOC容器中了。
通過XML文件,我們可以將JavaBean注入到Spring的IOC容器中。那使用註解又該如何實現呢?別急,其實使用註解比使用XML文件要簡單的多,我們在項目的io.mykit.spring.plugins.register.config包下創建PersonConfig類,並在PersonConfig類上添加@Configuration註解來標註PersonConfig類是一個Spring的配置類,通過@Bean註解將Person類注入到Spring的IOC容器中。
package io.mykit.spring.plugins.register.config;
import io.mykit.spring.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author binghe
* @version 1.0.0
* @description 以註解的形式來配置Person
*/
@Configuration
public class PersonConfig {
@Bean
public Person person(){
return new Person("binghe001", 18);
}
}
沒錯,通過PersonConfig類我們就能夠將Person類注入到Spring的IOC容器中,是不是很Nice!!主要我們在類上加上@Configuration註解,並在方法上加上@Bean註解,就能夠將方法中創建的JavaBean注入到Spring的IOC容器中。
接下來,我們在SpringBeanTest類中創建一個testAnnotationConfig()方法來測試通過註解注入的Person類,如下所示。
@Test
public void testAnnotationConfig(){
ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig.class);
Person person = context.getBean(Person.class);
System.out.println(person);
}
運行testAnnotationConfig()方法,輸出的結果信息如下所示。
Person(name=binghe001, age=18)
可以看出,通過註解將Person類注入到了Spring的IOC容器中。
到這裏,我們已經明確,通過XML文件和註解兩種方式都可以將JavaBean注入到Spring的IOC容器中。那麼,使用註解將JavaBean注入到IOC容器中時,使用的bean的名稱是什麼呢? 我們可以在testAnnotationConfig()方法中添加如下代碼來獲取Person類型下的註解名稱。
//按照類型找到對應的bean名稱數組
String[] names = context.getBeanNamesForType(Person.class);
Arrays.stream(names).forEach(System.out::println);
完整的testAnnotationConfig()方法的代碼如下所示。
@Test
public void testAnnotationConfig(){
ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig.class);
Person person = context.getBean(Person.class);
System.out.println(person);
//按照類型找到對應的bean名稱數組
String[] names = context.getBeanNamesForType(Person.class);
Arrays.stream(names).forEach(System.out::println);
}
運行testAnnotationConfig()方法輸出的結果信息如下所示。
Person(name=binghe001, age=18)
person
那這裏的person是啥?我們修改下PersonConfig類中的person()方法,將person()方法修改成person01()方法,如下所示。
package io.mykit.spring.plugins.register.config;
import io.mykit.spring.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author binghe
* @version 1.0.0
* @description 以註解的形式來配置Person
*/
@Configuration
public class PersonConfig {
@Bean
public Person person01(){
return new Person("binghe001", 18);
}
}
此時,我們再次運行testAnnotationConfig()方法,輸出的結果信息如下所示。
Person(name=binghe001, age=18)
person01
看到這裏,大家應該有種豁然開朗的感覺了,沒錯!!使用註解注入Javabean時,bean在IOC中的名稱就是使用@Bean註解標註的方法名稱。我們可不可以為bean單獨指定名稱呢?那必須可以啊!只要在@Bean註解中明確指定名稱就可以了。比如下面的PersonConfig類的代碼,我們將person01()方法上的@Bean註解修改成@Bean(“person”)註解,如下所示。
package io.mykit.spring.plugins.register.config;
import io.mykit.spring.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author binghe
* @version 1.0.0
* @description 以註解的形式來配置Person
*/
@Configuration
public class PersonConfig {
@Bean("person")
public Person person01(){
return new Person("binghe001", 18);
}
}
此時,我們再次運行testAnnotationConfig()方法,輸出的結果信息如下所示。
Person(name=binghe001, age=18)
person
可以看到,此時,輸出的JavaBean的名稱為person。
結論:我們在使用註解方式向Spring的IOC容器中注入JavaBean時,如果沒有在@Bean註解中明確指定bean的名稱,就使用當前方法的名稱來作為bean的名稱;如果在@Bean註解中明確指定了bean的名稱,則使用@Bean註解中指定的名稱來作為bean的名稱。
好了,咱們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一起學習一起進步!!
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation
如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Spring註解驅動開發。公眾號回復“spring註解”關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發不再迷茫。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※教你寫出一流的銷售文案?
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※回頭車貨運收費標準
※別再煩惱如何寫文案,掌握八大原則!
※超省錢租車方案
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※推薦台中搬家公司優質服務,可到府估價
前面我們聊到了dockerfile的 FROM、COPY 、ADD、LABEL、MAINTAINER、ENV、ARG、WORKDIR、VOLUME、EXPOSE、RUN、CMD、ENTRYPOINT指令的使用和說明,回顧請參考https://www.cnblogs.com/qiuhom-1874/tag/Dockerfile/;今天我們來聊聊剩下的dockerfile指令的使用和說明;
1、USER:該指令用於指定運行image時的或運行dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序時的用戶名或UID;默認情況下,container的運行身份為root用戶;語法格式 USER <UID>|<UserName>; 需要注意的是,<UID>可以為任意数字,但實踐中其必須為/etc/passwd中某用戶的有效UID,否則,docker run命令將運行失敗;
示例:
[root@node1 test]# cat Dockerfile FROM centos:7 LABEL maintainer="qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." RUN useradd nginx USER nginx CMD ["sleep","3000"] [root@node1 test]#
提示:以上dockerfile表示在鏡像運行成容器時,以nginx用戶運行 sleep 3000
驗證:編譯成鏡像,啟動為容器,然後進入到容器里看看sleep 3000 是否是nginx用戶在運行?
[root@node1 test]# docker build . -t test:v1 Sending build context to Docker daemon 1.051MB Step 1/7 : FROM centos:7 ---> b5b4d78bc90c Step 2/7 : LABEL maintainer="qiuhom <qiuhom@linux-1874.com>" ---> Running in 0f503dae4448 Removing intermediate container 0f503dae4448 ---> d31363b96f38 Step 3/7 : LABEL version="1.0" ---> Running in 8dad05999903 Removing intermediate container 8dad05999903 ---> 2281f36d7c3c Step 4/7 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Running in d2be9ed44aee Removing intermediate container d2be9ed44aee ---> 8de872e222fb Step 5/7 : RUN useradd nginx ---> Running in 37bda6ba6b60 Removing intermediate container 37bda6ba6b60 ---> dc681f95f5ca Step 6/7 : USER nginx ---> Running in 97d2357826f9 Removing intermediate container 97d2357826f9 ---> ed277ac0c482 Step 7/7 : CMD ["sleep","3000"] ---> Running in 0ea578fa10bc Removing intermediate container 0ea578fa10bc ---> 461f6ceabc88 Successfully built 461f6ceabc88 Successfully tagged test:v1 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v1 461f6ceabc88 3 seconds ago 204MB centos 7 b5b4d78bc90c 4 weeks ago 203MB [root@node1 test]# docker run --name t1 --rm -d test:v1 37e46346d6ca0ab05b67f5350d4c2a7b6b86b8d34c8d1622d78ef70b7d3dff86 [root@node1 test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37e46346d6ca test:v1 "sleep 3000" 3 seconds ago Up 2 seconds t1 [root@node1 test]# docker exec -it t1 /bin/bash [nginx@37e46346d6ca /]$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND nginx 1 0.1 0.0 4364 352 ? Ss 10:02 0:00 sleep 3000 nginx 6 0.4 0.0 11828 1808 pts/0 Ss 10:02 0:00 /bin/bash nginx 23 0.0 0.0 51756 1708 pts/0 R+ 10:02 0:00 ps aux [nginx@37e46346d6ca /]$ exit exit [root@node1 test]#
提示:可以看到基於上面的dockerfile構建的鏡像運行為容器,裏面默認跑的進程就是我們在dockerfile中指定用戶運行的進程;使用USER指定用戶運行容器里的進程,需要注意該用戶要對運行進程所需資源的所有權限;否則容器運行不起來;
2、HEALTHCHECK:該指令用於定義如何對容器做健康狀態檢測;運行為容器后,容器里的進程不掛掉,當然容器也就不會掛掉,但是存在一種情況,容器沒有掛掉,容器里的進程無法正常提供服務了,這個時候我們就需要通過一定的手段,第一時間知道容器里的進程是否健康(是否能夠正常提供服務);healthcheck指令就是用來定義如果去檢測容器內部進程是否健康;語法格式HEALTHCHECK [OPTIONS] CMD command;其中CMD是固定格式,而後面的command是對容器里的進程做健康狀態檢查的命令;而options是用來指定對容器做健康狀態檢查的周期時間相關信息;–interval=DURATION (default: 30s),該選項用於指定對容器做健康狀態檢查的頻率,默認是30s一次;–timeout=DURATION (default: 30s),該選項用於指定對容器內部的進程做健康狀態檢查的超時時長,默認是30秒;–start-period=DURATION (default: 0s)指定對容器中的進程做健康狀態檢查延遲時間,默認0表示不延遲;這裏補充一點,之所以要延遲多少秒做健康狀態檢查是因為,docker運行為容器以後,會立刻把該容器的狀態標記為running狀態,而對於有些初始化比較慢的容器,如果馬上對它做健康狀態檢查,可能是不健康的狀態,這樣一來我們對了解容器是否健康就不是很準確了;如果配合某些工具,很可能存在檢測到容器不健康就把該容器刪除,然後重新創建,以此重複;這樣就會導致我們的容器啟動不起來; –retries=N (default: 3)表示指定對容器做健康狀態檢查的重試次數,默認是3次;也就是說檢查到容器不健康的前提或健康的前提,它都會檢查3次,如果3次檢查都是失敗狀態那麼就標記該容器不健康;而對於我們指定的命令來講,命令的返回值就決定了容器是否健康,通常命令返回值為0表示我們執行的命令正常退出,也就意味着容器是健康狀態;命令返回值為1表示容器不健康;返回值為2我們通常都是保留不使用;HEALTHCHECK NONE就表示不對容器做健康狀態檢查;
示例:
[root@node1 test]# cat Dockerfile
FROM centos:7
LABEL maintainer="qiuhom <qiuhom@linux-1874.com>"
LABEL version="1.0"
LABEL description="this is test file \ that label-values can span multiple lines."
RUN yum install -y httpd
ADD ok.html /var/www/html/
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
HEALTHCHECK --interval=5s --timeout=5s --start-period=5s --retries=2 \
CMD curl -f http://localhost/ok.html || exit 1
[root@node1 test]#
提示:以上HEALTHCHECK指令表示每5秒檢查一次,超時時長為5秒,延遲5秒開始檢查,重試2次;如果curl -f http://localhost/ok.html這條命令正常返回0,那麼就表示容器健康,否則就返回1,表示容器不健康;
驗證:把以上dockerfile構建成鏡像啟動為容器,我們把ok.html刪除或移動到別的目錄,看看容器是否標記為不健康?
[root@node1 test]# docker build . -t test:v1.1 Sending build context to Docker daemon 1.052MB Step 1/8 : FROM centos:7 ---> b5b4d78bc90c Step 2/8 : LABEL maintainer="qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> d31363b96f38 Step 3/8 : LABEL version="1.0" ---> Using cache ---> 2281f36d7c3c Step 4/8 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 8de872e222fb Step 5/8 : RUN yum install -y httpd ---> Running in 9964718a2c3e Loaded plugins: fastestmirror, ovl Determining fastest mirrors * base: mirrors.bfsu.edu.cn * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com Resolving Dependencies --> Running transaction check ---> Package httpd.x86_64 0:2.4.6-93.el7.centos will be installed --> Processing Dependency: httpd-tools = 2.4.6-93.el7.centos for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-93.el7.centos.x86_64 --> Running transaction check ---> Package apr.x86_64 0:1.4.8-5.el7 will be installed ---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed ---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed ---> Package httpd-tools.x86_64 0:2.4.6-93.el7.centos will be installed ---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: httpd x86_64 2.4.6-93.el7.centos base 2.7 M Installing for dependencies: apr x86_64 1.4.8-5.el7 base 103 k apr-util x86_64 1.5.2-6.el7 base 92 k centos-logos noarch 70.0.6-3.el7.centos base 21 M httpd-tools x86_64 2.4.6-93.el7.centos base 92 k mailcap noarch 2.1.41-2.el7 base 31 k Transaction Summary ================================================================================ Install 1 Package (+5 Dependent packages) Total download size: 24 M Installed size: 32 M Downloading packages: warning: /var/cache/yum/x86_64/7/base/packages/apr-1.4.8-5.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY Public key for apr-1.4.8-5.el7.x86_64.rpm is not installed -------------------------------------------------------------------------------- Total 2.0 MB/s | 24 MB 00:12 Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Importing GPG key 0xF4A80EB5: Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>" Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 Package : centos-release-7-8.2003.0.el7.centos.x86_64 (@CentOS) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : apr-1.4.8-5.el7.x86_64 1/6 Installing : apr-util-1.5.2-6.el7.x86_64 2/6 Installing : httpd-tools-2.4.6-93.el7.centos.x86_64 3/6 Installing : centos-logos-70.0.6-3.el7.centos.noarch 4/6 Installing : mailcap-2.1.41-2.el7.noarch 5/6 Installing : httpd-2.4.6-93.el7.centos.x86_64 6/6 Verifying : mailcap-2.1.41-2.el7.noarch 1/6 Verifying : apr-util-1.5.2-6.el7.x86_64 2/6 Verifying : httpd-2.4.6-93.el7.centos.x86_64 3/6 Verifying : apr-1.4.8-5.el7.x86_64 4/6 Verifying : httpd-tools-2.4.6-93.el7.centos.x86_64 5/6 Verifying : centos-logos-70.0.6-3.el7.centos.noarch 6/6 Installed: httpd.x86_64 0:2.4.6-93.el7.centos Dependency Installed: apr.x86_64 0:1.4.8-5.el7 apr-util.x86_64 0:1.5.2-6.el7 centos-logos.noarch 0:70.0.6-3.el7.centos httpd-tools.x86_64 0:2.4.6-93.el7.centos mailcap.noarch 0:2.1.41-2.el7 Complete! Removing intermediate container 9964718a2c3e ---> a931e93eea06 Step 6/8 : ADD ok.html /var/www/html/ ---> 97e61f41911d Step 7/8 : CMD ["/usr/sbin/httpd","-DFOREGROUND"] ---> Running in e91ccdef90c2 Removing intermediate container e91ccdef90c2 ---> 7c8af9bb7eb3 Step 8/8 : HEALTHCHECK --interval=5s --timeout=5s --start-period=5s --retries=2 CMD curl -f http://localhost/ok.html || exit 1 ---> Running in 80682ab087d3 Removing intermediate container 80682ab087d3 ---> aa53cba15046 Successfully built aa53cba15046 Successfully tagged test:v1.1 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v1.1 aa53cba15046 8 seconds ago 312MB test v1 461f6ceabc88 57 minutes ago 204MB centos 7 b5b4d78bc90c 4 weeks ago 203MB [root@node1 test]# docker run --name t1 --rm -d test:v1.1 332590e683fcb29f60a28703548fce7aa83df715cbb840e1283472834867d6a1 [root@node1 test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 332590e683fc test:v1.1 "/usr/sbin/httpd -DF…" 3 seconds ago Up 2 seconds (health: starting) t1 [root@node1 test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 332590e683fc test:v1.1 "/usr/sbin/httpd -DF…" 7 seconds ago Up 6 seconds (healthy) t1 [root@node1 test]#
提示:可以看到基於我們寫的dockerfile構建的鏡像已經成功運行為容器,並且標記為healthy;接下來我們進入容器把ok.html幹掉,然後在看看容器是否標記為不健康狀態?
提示:從上面的信息可以看到我們把ok.html移除后,容器狀態就變成不健康狀態了;我們再把ok.html還原到原有位置,看看容器是否會從不健康轉換為健康呢?
提示:可以看到把ok.html還原到/var/www/html/目錄后,容器從不健康狀態變為了健康狀態;
3、SHELL:該指令用於指定默認shell,該指令開始到下一個SHELL中間的命令都是SHELL指定的shell 運行,所以SHELL指令在dockerfile中可出現多次,後面的SHELL指令指定的shell會覆蓋前面所有SHELL指令指定的shell;默認在Linux上是[“/bin/sh”,”-c”]在Windows上述[“cmd”,”/s”,”/c”];SHELL指令必須是以json數組的格式定義;語法SHELL [“executable”, “parameters”];
4、STOPSIGNAL:該指令用於定義停止容器的信號;默認停止容器是15號信號 SIGTERM;語法STOPSIGNAL signal
5、ONBUILD:該指令用於在Dockerfile中定義一個觸發器;Dockerfile用於build映像文件,此映像文件亦可作為base image被另一個Dockerfile用作FROM指令的參數,並以之構建新的映像文件;在後面的這個Dockerfile中的FROM指令在build過程中被執行時,將會“觸發”創建其base image的Dockerfile文件中的ONBUILD指令定義的觸發器;用法格式ONBUILD <INSTRUCTION>;儘管任何指令都可註冊成為觸發器指令,但ONBUILD不能自我嵌套,且不會觸發FROM和MAINTAINER指令;使用包含ONBUILD指令的Dockerfile構建的鏡像應該使用特殊的標籤,例如ruby:2.0-onbuild;在ONBUILD指令中使用ADD或COPY指令應該格外小心,因為新構建過程的上下文在缺少指定的源文件時會失敗;
示例:
[root@node1 test]# cat Dockerfile FROM centos:7 LABEL maintainer="qiuhom <qiuhom@linux-1874.com>" ONBUILD RUN yum install -y httpd [root@node1 test]#
提示:以上dockerfile表示在本次構建鏡像中不運行yum install -y httpd這條命令,而是在後面的dockerfile中以本dockerfile製作的進行作為基礎繼續時,yum install -y httpd這條命令就會被觸發執行;簡單講onbuild就是指定dockerfile指令延遲執行;這裏一定要記住一點onbuild指令後面一定是跟的是dockerfile指令;
驗證:將上面的dockerfile編譯鏡像,看看yum install -y httpd 是否執行了?
[root@node1 test]# docker build . -t test:v1.5 Sending build context to Docker daemon 1.052MB Step 1/3 : FROM centos:7 ---> b5b4d78bc90c Step 2/3 : LABEL maintainer="qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> d31363b96f38 Step 3/3 : ONBUILD RUN yum install -y httpd ---> Running in d3601fa1c3b7 Removing intermediate container d3601fa1c3b7 ---> 370e3a843c3c Successfully built 370e3a843c3c Successfully tagged test:v1.5 [root@node1 test]#
提示:可以看到yum install -y httpd 這條命令並沒有執行;
驗證:將我們上面製作好的鏡像作為基礎鏡像,再來製作其他鏡像,看看yum install -y httpd 被執行?
[root@node1 aaa]# pwd /root/test/aaa [root@node1 aaa]# ls Dockerfile [root@node1 aaa]# cat Dockerfile FROM test:v1.5 LABEL maintainer="qiuhom <admin@admin.com>" [root@node1 aaa]# docker build . -t myweb:v1 Sending build context to Docker daemon 2.048kB Step 1/2 : FROM test:v1.5 # Executing 1 build trigger ---> Running in cf93e9f03e89 Loaded plugins: fastestmirror, ovl Determining fastest mirrors * base: mirrors.huaweicloud.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.com Resolving Dependencies --> Running transaction check ---> Package httpd.x86_64 0:2.4.6-93.el7.centos will be installed --> Processing Dependency: httpd-tools = 2.4.6-93.el7.centos for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-93.el7.centos.x86_64 --> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-93.el7.centos.x86_64 --> Running transaction check ---> Package apr.x86_64 0:1.4.8-5.el7 will be installed ---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed ---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed ---> Package httpd-tools.x86_64 0:2.4.6-93.el7.centos will be installed ---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: httpd x86_64 2.4.6-93.el7.centos base 2.7 M Installing for dependencies: apr x86_64 1.4.8-5.el7 base 103 k apr-util x86_64 1.5.2-6.el7 base 92 k centos-logos noarch 70.0.6-3.el7.centos base 21 M httpd-tools x86_64 2.4.6-93.el7.centos base 92 k mailcap noarch 2.1.41-2.el7 base 31 k Transaction Summary ================================================================================ Install 1 Package (+5 Dependent packages) Total download size: 24 M Installed size: 32 M Downloading packages: warning: /var/cache/yum/x86_64/7/base/packages/apr-1.4.8-5.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY Public key for apr-1.4.8-5.el7.x86_64.rpm is not installed -------------------------------------------------------------------------------- Total 7.2 MB/s | 24 MB 00:03 Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Importing GPG key 0xF4A80EB5: Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>" Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 Package : centos-release-7-8.2003.0.el7.centos.x86_64 (@CentOS) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : apr-1.4.8-5.el7.x86_64 1/6 Installing : apr-util-1.5.2-6.el7.x86_64 2/6 Installing : httpd-tools-2.4.6-93.el7.centos.x86_64 3/6 Installing : centos-logos-70.0.6-3.el7.centos.noarch 4/6 Installing : mailcap-2.1.41-2.el7.noarch 5/6 Installing : httpd-2.4.6-93.el7.centos.x86_64 6/6 Verifying : mailcap-2.1.41-2.el7.noarch 1/6 Verifying : apr-util-1.5.2-6.el7.x86_64 2/6 Verifying : httpd-2.4.6-93.el7.centos.x86_64 3/6 Verifying : apr-1.4.8-5.el7.x86_64 4/6 Verifying : httpd-tools-2.4.6-93.el7.centos.x86_64 5/6 Verifying : centos-logos-70.0.6-3.el7.centos.noarch 6/6 Installed: httpd.x86_64 0:2.4.6-93.el7.centos Dependency Installed: apr.x86_64 0:1.4.8-5.el7 apr-util.x86_64 0:1.5.2-6.el7 centos-logos.noarch 0:70.0.6-3.el7.centos httpd-tools.x86_64 0:2.4.6-93.el7.centos mailcap.noarch 0:2.1.41-2.el7 Complete! Removing intermediate container cf93e9f03e89 ---> a89914bda4b5 Step 2/2 : LABEL maintainer="qiuhom <admin@admin.com>" ---> Running in e175e0542b5e Removing intermediate container e175e0542b5e ---> 4f406abeaab7 Successfully built 4f406abeaab7 Successfully tagged myweb:v1 [root@node1 aaa]#
提示:可以看到在我們的dockerfile中並沒有寫 RUN yum install -y httpd ,但build時卻執行了 yum install -y httpd ;這是因為onbuild指令被觸發了;我們可以理解為如果我們製作的鏡像有onbuild指令指定的命令,那麼該鏡像被其他dockerfile 作為基礎鏡像時(或者被其他docker FROM指令引用時)onbuild指定就會被激活,被執行;
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※超省錢租車方案
※別再煩惱如何寫文案,掌握八大原則!
※回頭車貨運收費標準
※教你寫出一流的銷售文案?
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※網頁設計最專業,超強功能平台可客製化
在頒獎典禮上,中國年度卡車評委會主席於晶對歐曼EST超級卡車給予了高度評價:歐曼EST超級卡車不僅秉承了歐洲重卡設計理念,在質量和效率方面也引進了戴姆勒的體系和標準,在動力、環保、安全、智能化方面展示出富有前瞻性的技術水平,在實際測試過程中,歐曼EST的加速時間、制動距離以及車內噪聲等多項數據都處於行業領先水平。
2016年11月17日,“2017中國年度卡車”(CToY)頒獎典禮暨廣州商用車展媒體之夜”在廣州舉行;中國國際貿易促進委員會汽車行業分會副會長楊琳、國際年度卡車組委會主席Gianenrico Griffini(格里菲尼)、中國年度卡車評委會主席於晶以及來自整車及零部件生產企業的代表、國內主流行業媒體代表,共同見證了這一中國卡車行業的年度盛事。
在經過包括技術創新、舒適性、安全性、操控性、燃油經濟性、清潔環保和總體擁有成本等方面的綜合評價后,11月正式中國上市的歐曼EST超級卡車最終摘得了“2017中國年度卡車”桂冠,成為中國首個獲得此項殊榮的重卡車型;這是歐曼EST在歷經了“4年的歐洲研發、德國DEKRA的歐洲嚴苛測試、德國漢諾威全球上市”的品質驗證后,獲得的首個極具含金量的年度大獎;這是國際年度卡車評委會、中國年度卡車評委會對歐曼EST超級卡車的卓越品質給予的高度認可,也是對福田戴姆勒汽車在推動中國重卡市場高端化發展方面給予的肯定。
2017中國年度卡車大獎含金量有多高?
中國年度卡車是國內商用車行業首個引入“國際年度卡車”獎項評選標準及規則的獎項, 並結合中國道路運輸實際情況,以客觀公正的平台、專業縝密的視角評選出年度最具標杆意義的中國卡車車型。
“國際年度卡車”獎是目前國際上廣泛認可的權威評選卡車類獎項,代表了歐洲最嚴苛的評價指標。作為世界最大的商用車生產商梅賽德斯-奔馳憑藉旗下多款創新車型,曾8次摘得“國際年度卡車”獎項,成為榮獲此獎項次數最多的品牌。 “中國年度卡車”與“國際年度卡車”評選有着同樣的含金量,受邀出席頒獎典禮的國際年度卡車評委會主席Gianenrico Griffini(格里菲尼)也表達了對“2017中國年度卡車”評選的肯定,並表示國際年度卡車評委會將為中國年度卡車評選提供最大的支持。
“2017中國年度卡車”大獎的所有參評車型,必須經過由國際年度卡車評委會成員、媒體代表、用戶及第三方測試機構組成的專業評委會客觀公正、專業縝密的評測;其評測標準也是依據國際年度卡車評選及歐洲卡車1000分評測方法,涉及駕駛室空間及內飾設計、駕乘舒適性、操控性能、車輛總擁有成本、安全性、動力性等6個大項、26個小項;無論是從評價體系的成熟性上還是從評測人員及項目的專業性上,“2017中國年度卡車”獎項的含金量可謂首屈一指。
在頒獎典禮上,中國年度卡車評委會主席於晶對歐曼EST超級卡車給予了高度評價:歐曼EST超級卡車不僅秉承了歐洲重卡設計理念,在質量和效率方面也引進了戴姆勒的體系和標準,在動力、環保、安全、智能化方面展示出富有前瞻性的技術水平,在實際測試過程中,歐曼EST的加速時間、制動距離以及車內噪聲等多項數據都處於行業領先水平。
超級卡車憑什麼能獲得年度卡車大獎?
“2017中國年度卡車大獎”旨在頒發給最近12個月內發布的、從多方面對道路運輸效率做出最大貢獻的中國品牌卡車;更高的質量、更強的性能、更快的效率、更低的成本,歐曼EST超級卡車在提升整个中國重卡技術與品質方面做出了巨大貢獻,換句話說,歐曼EST超級卡車成為“2017中國年度卡車”實至名歸。“歐曼EST超級卡車充分吸收了‘超級卡車全球創新聯盟’成員的先進科技成果,以“北京超級卡車創新中心”為依託,實現了自動駕駛、新能源及車聯網等智慧科技的應用,使歐曼EST超級卡車擁有了媲美國際重卡的技術實力。” 福田戴姆勒汽車品牌總監李健致辭中表示。
歐曼EST超級卡車是福田戴姆勒汽車鏈合德國戴姆勒整車及動力技術,攜手美國康明斯、德國采埃孚、德國大陸等超級卡車全球創新聯盟成員,面向準時高效、長途高附加值貨運等高端物流客戶,歷時4年以歐洲標準研發, 完成了歐洲最嚴苛的德國DEKRA測試,以及歷經1000萬公里實際道路測試,實現了油耗降低5-10%,碳排放減少10-15%,貨運效率提升30%,實現智能輔助駕駛、B10壽命達到150萬公里以及10萬公里的超長保養周期的卓越性能,全面提升了中國現代化物流體系在智能化、安全性、高效性方面的發展速度。歐曼EST超級卡車於11月14日,在2016中國上海智能網聯汽車展覽會上,正式上市,登陸中國市場,為中國用戶在未來高效物流運輸市場競爭中,注入了來自“超級卡車”的超級競爭力!
參与測試的中國年度卡車評委會的評委一致認為:歐曼EST的駕駛室在空間和舒適性方面接近歐洲品牌卡車,非常適合超長距離運輸使用;其採用的采埃孚TraXon自動變速器與奔馳、康明斯發動機匹配完美,對於中國市場而言是一項巨大的進步,可以滿足中國用戶日益提高的使用需求;此外,歐曼EST超級卡車還具有良好的視野和高速行駛穩定性,多項主被動安全裝置讓車輛更加容易操控;採用氣囊減振的駕駛室及空氣懸架底盤,在測試過程中帶來了良好的駕乘舒適性;在有效載荷和保養間隔等方面能幫助用戶有效提高運營效率,作為一款專為中國市場打造的高端長途運輸車型,歐曼EST超級卡車全面展示了中國重卡的最新技術水平。
歐曼EST超級卡車在歷經了歐洲研發、歐洲測試、歐洲車展、歐洲上市之後,回到中國,憑藉在“智能化、安全性、可靠性、經濟性及舒適性”方面的卓越表現,獲得“2017中國年度卡車”大獎,以歐洲科技的品質內涵,確立了在中國重卡行業的技術領先地位,全面滿足重卡用戶高端化、高效化、智能化的需求!未來,福田戴姆勒汽車將再接再厲,充分吸收“超級卡車全球創新聯盟”成員的先進科技成果,以“北京超級卡車創新中心”為依託,以品質、技術和創新能力打造更具核心競爭力的產品,不斷提升中國卡車技術水平本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※教你寫出一流的銷售文案?
※別再煩惱如何寫文案,掌握八大原則!
外觀方面,該車相比先期上市的北京伽途ix系列更具時尚氣息。中網格柵由大面積鍍鉻材質組成,層次感較為鮮明。尺寸方面,伽途im6長/寬/高依次為4700/1780/1820mm。而伽途im8的長/寬/高依次為4730×1810×1830mm,兩車軸距同為2760mm。內飾方面,中控台液晶屏尺寸較大,面板採用了碳纖維材質和仿桃木水轉印材質進行裝飾。
11月18日,福田汽車乘用車品牌在廣州車展重磅發布北京伽途im系列新品,引領MpV市場全面升級。該系列車型包含北京伽途im6和北京伽途im8兩款產品,前置前驅的配置,更大的空間,在保障產品安全性的同時,在舒適性、便利性和人性化方面更進一步,尤其是智能車聯網系統,通過大數據共享,將人與車通過網絡實時互聯,實現人與車有效互動,憑藉全面智能化升級,滿足用戶多元化的需求。
為大家庭時代品質出行而來
二胎政策出台意味着家庭結構將發生明顯的變化,大家庭的出行對車輛的空間、駕乘舒適性和安全性等均提出更高的要求,能夠滿足大家庭出行用車的MpV車型呈現出快速增長趨勢,同時大家庭的出現也對家庭第二輛車有較大的潛在需求。
定位“智能家庭車”的北京伽途,以“引領新汽車生活潮流、提升大家庭出行品質”為願景,致力於成就汽車消費者的“精智之道、愛家之選”。北京伽途中“伽”與中國濃厚的“家”文化傳統一脈相承,“伽途”寓意“家庭的美好前途”。
北京伽途作為融合科技、智能、時尚的未來智能汽車的代表,目標市場精準鎖定為中國乘用車需求最旺盛的大家庭用車市場。在福田汽車“互聯網汽車生態系統”基礎上,其以滿足用戶個性化需求為導向,基於網絡信息系統、OTD訂單系統和智能製造系統的定製化大規模生產方式,實現研發力、製造力、營銷力和品牌力的不斷提升,最大程度滿足大家庭消費者需求。
隨着消費者生活水平的提高,對MpV車型的需求也在向中高端發展。針對目前增長較快的前驅市場,北京伽途迅速抓住有利時機,推出了中高端重磅新品——im系列。該系列以其獨到的智能、舒適、時尚、安全可靠等多重優勢成為福田汽車集團鋪路乘用車領域的扛鼎之作。
大氣靈動智慧升級
北京伽途im系列車型延續了福田汽車工業4.0體系的“智造”水準,兼具大氣靈動的外觀與科幻感的座艙設計,以比肩世界的技術和品質,代表着福田汽車對中國汽車工業的誠意探索。
外觀方面,該車相比先期上市的北京伽途ix系列更具時尚氣息。中網格柵由大面積鍍鉻材質組成,層次感較為鮮明。尺寸方面,伽途im6長/寬/高依次為4700/1780/1820mm;而伽途im8的長/寬/高依次為4730×1810×1830mm,兩車軸距同為2760mm。
內飾方面,中控台液晶屏尺寸較大,面板採用了碳纖維材質和仿桃木水轉印材質進行裝飾。方向盤採用了三幅式設計,優質仿皮材質輪緣,握感舒適。整體造型較為硬朗,比較符合時下年輕人的審美需求。
動力方面,北京伽途im系列兩款產品採用了兩款不同的動力系統。北京伽途im6配備福田1.5L 4A15M發動機,最大功率81kW;北京伽途im8則採用東安1.5L DAM15D機型,最大功率85kW。
據悉,廣州車展是北京伽途im系列繼全國發布之後區域亮相的第一站,該系列產品將於2017年2月正式登陸全國市場,讓我們拭目以待。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※台北網頁設計公司全省服務真心推薦
※想知道最厲害的網頁設計公司"嚨底家"!
※推薦評價好的iphone維修中心
※網頁設計最專業,超強功能平台可客製化
※別再煩惱如何寫文案,掌握八大原則!
按照規則,5篇文章中任意1篇,評論獲得支持率最高的用戶可以獲得小米MAX一台。支持率排名2-5位的用戶,可以獲得變形金剛吸塵器1個。支持率排名6-10位的用戶,可以獲得變形金剛皮套1個。注意:每位微信用戶在本次活動僅能獲得一個獎品,以最高排名的文章為準,其餘文章的排名作廢,獎品將順延至下一位。
經過4天時間的激烈角逐,玩車、車買買、玩車TV三大號聯合舉辦的“2016我就喜歡”年度車型評選投票,終於完滿結束。
本次參与投票的年度車型共有8款SUV和8款轎車,是由我們三大號資深編輯共同探討票選的,涵蓋10-50萬今年較為熱門的車型,名單如下所示。
活動評選規則為:由三大號5篇對比文章的投票數相加,得票最高的車型,將被評選為我們的“年度最受網友喜愛的車型”。
話不多說,馬上來看看本次評選的投票結果。
從數據中可以看出,三大平台用戶對車的喜好是相近的,投票的結果都差不多,TOp3車型更是符合小編的心理預期。
年度車型評選的投票結果公布完畢,但別忘了還有件正事——“送小米MAX”活動獲獎名單公布!
為了回饋我們三大號的粉絲,小編可是下了血本購回5台小米MAX,20個變形金剛大黃蜂吸塵器,以及25個變形金剛大黃蜂皮套來送給大家。活動規則公平,在微信平台上全程公開,所以人人的機會都是平等的。
按照規則,5篇文章中任意1篇,評論獲得支持率最高的用戶可以獲得小米MAX一台;支持率排名2-5位的用戶,可以獲得變形金剛吸塵器1個;支持率排名6-10位的用戶,可以獲得變形金剛皮套1個。
注意:每位微信用戶在本次活動僅能獲得一個獎品,以最高排名的文章為準,其餘文章的排名作廢,獎品將順延至下一位。
經過4天的龍爭虎鬥,跌宕起伏的排名終於在11月22日晚24點那一刻定格,獲獎名單如下:
請獲獎用戶按以下步驟聯繫我們:
1、獲獎評論的“留言入選提示”截圖
2、投票頁面截圖
3、編輯您的姓名、電話、郵寄地址
4、將2張截圖以及您的信息,用中獎微信號發送至文章所在公眾號的聊天界面(玩車、車買買、玩車TV)
最後,我們會有專人在工作日第一時間與您取得聯繫,中獎獎品將在確認信息后,在3個工作日內陸續發出。如果在11月25日晚24:00尚未領獎的,我們將順延至下一位用戶,以此類推。
活動詳情規則請點擊
寫在最後:
我們辦這個活動的初衷,就是以有趣的形式給大家帶來相關車型的對比,車型數龐大、內容精緻,讓用戶通過3個平台不同的對比能更直觀地了解一台車。最後活動也取得了非常高的關注度,還有用戶在看完我們的建議後果斷訂了車,總之非常感謝大家能給予我們支持,我們在日後還會給大家帶來更有價值的汽車內容。
回顧8款轎車/8款SUV精彩專題報道
請點擊此處:【廣州車展專題回顧】本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※台北網頁設計公司這麼多該如何選擇?
※智慧手機時代的來臨,RWD網頁設計為架站首選
※評比南投搬家公司費用收費行情懶人包大公開
※回頭車貨運收費標準
※網頁設計最專業,超強功能平台可客製化
※別再煩惱如何寫文案,掌握八大原則!
此時你可以將被換下的輪胎墊在車底,謹防車身壓到
作為一個備胎,你是不是整天躺在後備箱,想着有一天可以逆襲?不用怕,今天讓我們的小喬姐姐親身示範,教你如何換備胎。
第一步 放置三角牌
如果你在馬路邊需要換胎,首先要做的就是在車後放置三角牌,最安全距離是150米以外,這樣可以提示後面來車,謹防追尾事故。
第二步 擰松輪胎螺絲
如果你所用的是非全尺寸備胎,同時很不幸的前輪受損,一般情況下是先將後輪換到前輪,再把備胎裝到後輪,因為前輪是屬於驅動輪,這樣換置會更安全些。而在本視頻中由於時間關係,所以只換了前胎作為示範。
在鬆開螺絲時,我們一般會用腳踩着扳手,這樣會更省力更便捷。
第三步 用千斤頂頂起車身
使用千斤頂是要先找到車底的凹槽位,需對準后才可以進行車輛的升起,否則容易卡壞凹槽部位和車底,也可能會發生安全事故。此外,很多老司機都會習慣先用千斤頂頂起車身,再鬆開螺絲拆卸輪胎,但是其實先鬆開輪胎螺絲再用千斤頂才是最方便的方法。
第四步 卸下輪胎
姿勢要到位,深蹲,抬起輪胎往外拔。
第五步 裝上備胎 預緊螺絲
在裝備胎時,要對準螺絲孔位,然後把螺絲裝上,用手預擰緊它。此時你可以將被換下的輪胎墊在車底,謹防車身壓到本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
※回頭車貨運收費標準
內飾內飾上傳祺GS4採用了環抱式設計,六邊形元素設計的中控台和按鍵比較新穎,搭配着鍍鉻和烤漆裝飾條,裝配工藝良好。雖然繽智為精英型車型,但是車內整體看上去並不覺得廉價,表現得中規中矩。現代ix25採用了家族式T形設計理念,整體布局合理且錯落有致。
在國內火爆的SUV市場中,狀態最火熱的非小型SUV和緊湊型SUV莫屬了,而其中的車型又實在太多太多了,小編在SUV排行榜中順着找下來,發現傳祺GS4、本田繽智、現代ix25這三款車是中日韓SUV中比較熱門的,那麼15萬左右的購車預算,他么之中哪款最適合你呢?
有人就好奇了,本田CR-V、現代途勝的銷量不是比他們好么,為什麼沒入選呢,原因是15萬左右的價格並不能買得到,所以。。。
北京現代ix25
2015款 1.6L 自動兩驅智能型GLS
廠商指導價 14.28萬
繽智
2015款 1.8L CVT兩驅精英型
廠商指導價 14.68萬
傳祺GS4
2016款 235T G-DCT豪華版
廠商指導價 14.38萬
傳祺GS4在外觀原創度上極高,顛覆了自主品牌的抄襲現象,整體造型很有個性,飽滿而結實,凌雲翼式的進氣格柵搭配犀利的前大燈,辨識度很高;繽智的設計則要時尚柔美得多,無論從哪個角度看去都給人圓潤飽滿的感覺,很耐看;而ix25的外觀則給人簡潔幹練的感覺,運用了更多的直線條設計理念,比較硬派。
內飾上傳祺GS4採用了環抱式設計,六邊形元素設計的中控台和按鍵比較新穎,搭配着鍍鉻和烤漆裝飾條,裝配工藝良好;雖然繽智為精英型車型,但是車內整體看上去並不覺得廉價,表現得中規中矩;現代ix25採用了家族式T形設計理念,整體布局合理且錯落有致。
配置上繽智和傳祺GS4均配備了电子駐車、自動駐車、多功能方向盤、倒車影像、中控彩色大屏等配置,而在無鑰匙啟動/進入系統、陡坡緩降、電動天窗等配置繽智是缺少的,唯一的亮點就是其配備了發動機啟停技術,傳祺GS4配置最為豐富,前後排頭部氣囊、胎壓監測、定速巡航、前排座椅加熱等配置。
從車身尺寸上面我們可以清楚的看出,傳祺GS4各方面都佔優勢,空間表現上更為出色,而繽智雖然定位於小型SUV,但是本田善於利用空間設計,乘坐空間表現非常好,ix25空間上則不佔優勢,只能說將將夠用吧。
傳祺GS4 1.5T渦輪增壓發動機馬力最大,但雙離合的耐用可靠性還有待考驗;本田1.8L發動機+CVT的動力組合駕駛平順性出色,燃油經濟性好;ix25的1.6L+6擋手自一體變速器動力總成技術成熟,但功率上稍微欠缺。
總結:有人就說小編了,你拿個緊湊型SUV和小型SUV比有點不公平啊,但是同一價位內,跨級別的錯位競爭必然是存在的,銷量上就證明了好多問題,這也是傳祺GS4性價比那麼高的原因所在。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※網頁設計最專業,超強功能平台可客製化
※回頭車貨運收費標準