鏡像,就是面向?qū)ο笾械念悾喈?dāng)于一個(gè)模板。從本質(zhì)上來說,鏡像相當(dāng)于一個(gè)文件系統(tǒng)。Docker 鏡像是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。

2.容器(Container)
容器,就是類創(chuàng)建的實(shí)例,就是依據(jù)鏡像這個(gè)模板創(chuàng)建出來的實(shí)體。容器的實(shí)質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的命名空間。因此容器可以擁有自己的root 文件系統(tǒng)、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間,甚至自己的用戶ID 空間。容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里,使用起來,就好像是在一個(gè)獨(dú)立于宿主的系統(tǒng)下操作一樣。這種特性使得容器封裝的應(yīng)用比直接在宿主運(yùn)行更加安全。

3.倉庫(Repository)
倉庫,從認(rèn)識(shí)上來說,就好像軟件包上傳下載站,有各種軟件的不同版本被上傳供用戶下載。鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主機(jī)上運(yùn)行,但是,如果需要在其它服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù),Docker Registry 就是這樣的服務(wù)。

三.Docker的優(yōu)勢

1.更高效的利用系統(tǒng)資源:由于容器不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開銷,Docker 對(duì)系統(tǒng)資源的利用率更高。無論是應(yīng)用執(zhí)行速度、內(nèi)存損耗或者文件存儲(chǔ)速度,都要比傳統(tǒng)虛擬機(jī)技術(shù)更高效。因此,相比虛擬機(jī)技術(shù),一個(gè)相同配置的主機(jī),往往可以運(yùn)行更多數(shù)量的應(yīng)用。

2.更快速的啟動(dòng)時(shí)間:傳統(tǒng)的虛擬機(jī)技術(shù)啟動(dòng)應(yīng)用服務(wù)往往需要數(shù)分鐘,而Docker 容器應(yīng)用,由于直接運(yùn)行于宿主內(nèi)核,無需啟動(dòng)完整的操作系統(tǒng),因此可以做到秒級(jí)、甚至毫秒級(jí)的啟動(dòng)時(shí)間。

3.一致的運(yùn)行環(huán)境:開發(fā)過程中一個(gè)常見的問題是環(huán)境一致性問題。由于開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境不一 致,導(dǎo)致有些bug 并未在開發(fā)過程中被發(fā)現(xiàn)。而Docker 的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境一致性,從而不會(huì)再出現(xiàn)這類問題。

4.持續(xù)交付和部署:Docker是build once,run everywhere. 使用Docker 可以通過定制應(yīng)用鏡像來實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、部署。開發(fā)人員可以通過Dockerfile 來進(jìn)行鏡像構(gòu)建,并結(jié)合持續(xù)集成(Continuous Integration) 系統(tǒng)進(jìn)行集成測試,而運(yùn)維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像。

5.更輕松的遷移:Docker 使用的分層存儲(chǔ)以及鏡像的技術(shù),使得應(yīng)用重復(fù)部分的復(fù)用更為容易,也使得應(yīng)用的維護(hù)更新更加簡單,基于基礎(chǔ)鏡像進(jìn)一步擴(kuò)展鏡像也變得非常簡單。

傳統(tǒng)開發(fā)流程

Docker環(huán)境開發(fā)流程

四.與傳統(tǒng)虛擬機(jī)對(duì)比

五.Docker命令

1.創(chuàng)建鏡像
1.1基于已有的鏡像容器創(chuàng)建

? ? docker commit [options] container [repository[:tag]]

                     option:-a, --author=“”       #作者信息

                                -m,--message=“”      #提交信息

                                -p,? --pause=true        #提交時(shí)暫停容器運(yùn)行

1.2基于本地模板導(dǎo)入創(chuàng)建

      docker load < ***.tar  --本地模板文件tar

1.3基于Dockerfile文件構(gòu)建鏡像

      docker build -t image-name basedir

2.刪除鏡像

        docker rmi image     #image可以是標(biāo)簽或者ID
        docker rmi –f image    #強(qiáng)制刪除鏡像
注意:用docker rmi 命令刪除鏡像時(shí),首先要?jiǎng)h除容器,再刪除鏡像。否則會(huì)提示鏡像在容器中運(yùn)行。

鏡像管理指令

3.創(chuàng)建/啟動(dòng)/停止/刪除容器

    docker  create image   #創(chuàng)建的容器是停止?fàn)顟B(tài)

    docker  start/stop container_id     #啟動(dòng)/停止容器

    docker  run image         #創(chuàng)建并啟動(dòng)容器

    docker rm container_id    #刪除容器

創(chuàng)建容器常用選項(xiàng)

管理容器常用命令

4.鏡像與容器聯(lián)系
鏡像不是一個(gè)單一的文件,而是有多層構(gòu)成。我們可以通過docker history <ID/NAME> 查看鏡像中各層內(nèi)容及大小,每層對(duì)應(yīng)著Dockerfile中的一條指令。Docker鏡像默認(rèn)存儲(chǔ)在/var/lib/docker/<storage-driver>中。
容器其實(shí)是在鏡像的最上面加了一層讀寫層,在運(yùn)行容器里做的任何文件改動(dòng),都會(huì)寫到這個(gè)讀寫層。如果容器刪除了,最上面的讀寫層也就刪除了,改動(dòng)也就丟失了。
Docker使用存儲(chǔ)驅(qū)動(dòng)管理鏡像每層內(nèi)容及可讀寫層的容器層。

5.將主機(jī)數(shù)據(jù)掛載到容器
Docker提供三種不同的方式將數(shù)據(jù)從宿主機(jī)掛載到容器中:volumes,bind mounts和tmpfs。

volumes:Docker管理宿主機(jī)文件系統(tǒng)的一部分(/var/lib/docker/volumes)。
bind mounts:可以存儲(chǔ)在宿主機(jī)系統(tǒng)的任意位置。
tmpfs:掛載存儲(chǔ)在宿主機(jī)系統(tǒng)的內(nèi)存中,而不會(huì)寫入宿主機(jī)的文件系統(tǒng)。

5.1 volume

注意:

# 如果沒有指定卷,自動(dòng)創(chuàng)建。
# 建議使用--mount,更通用。

5.2 Bind Mounts

注意:

# 如果源文件/目錄沒有存在,不會(huì)自動(dòng)創(chuàng)建,會(huì)拋出一個(gè)錯(cuò)誤。
# 如果掛載目錄在容器中非空目錄,則該目錄現(xiàn)有內(nèi)容將被隱藏。

5.3 tmpfs
容器中使用 tmpfs:

# docker run -d -it --name nginx-test --mount type=tmpfs,destination=/usr/share/nginx/html nginx
# docker run -d -it --name nginx-test --tmpfs /usr/share/nginx/html nginx

注意:

# tmpfs方式僅存儲(chǔ)在主機(jī)系統(tǒng)的內(nèi)存中,不會(huì)寫入主機(jī)的文件系統(tǒng)。
# tmpfs掛載不能在容器間共享。
# tmpfs只能在Linux容器上工作,不能在Windows容器上工作。

六.Docker實(shí)戰(zhàn)–構(gòu)建lnmp環(huán)境,搭建WordPress博客

實(shí)驗(yàn)環(huán)境:

1.Docker安裝
首先安裝依賴包

安裝Docker(之前已安裝過,所以提示已經(jīng)安裝)

查看Docker是否安裝成功

啟動(dòng)Docker并加入開機(jī)自啟動(dòng)

[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker

2.用Dockerfile方式構(gòu)建鏡像
Dockerfile指令

環(huán)境說明:
在本文中我都是基于centos 7.5系統(tǒng),nginx和php用的源碼包來構(gòu)建,如果你不想用源碼包,也可用yum方式構(gòu)建。

nginx,用的是源碼包來構(gòu)建,版本為nginx-1.12.2.tar.gz,下載地址http://nginx.org/en/download.html/
php,也用的源碼包來構(gòu)建,版本為php-5.6.31.tar.gz,下載地址http://php.net/downloads.php

創(chuàng)建鏡像時(shí)所需文件

在Dockerfiles目錄下創(chuàng)建了兩個(gè)目錄(nginx,php),里面分別存放Dockerfile文件、源碼包。nginx目錄下放了nginx.conf配置文件,php目錄下也放置了php.ini配置文件(在實(shí)際環(huán)境中,這兩個(gè)文件是經(jīng)常需要修改的,單獨(dú)拿出來后在啟動(dòng)容器時(shí)你可以把這兩個(gè)文件mount到容器中,便于管理。)。

2.1 nginx 構(gòu)建
Dockerfile內(nèi)容:

分析一下Dockerfile的內(nèi)容,當(dāng)你構(gòu)建鏡像時(shí),它會(huì)根據(jù)你編排好的內(nèi)容一步一步的執(zhí)行下去,如果當(dāng)中的某一步執(zhí)行不下去,會(huì)立刻停止構(gòu)建。上面的大部分指令都很好理解,大家可以對(duì)照上文的Dockerfile指令圖進(jìn)行理解,最后一個(gè)指令我要詳細(xì)說明一下:CMD ["./sbin/nginx","-g","daemon off;"]

./sbin/nginx ,就是正常啟動(dòng)nginx服務(wù);
-g: 設(shè)置配置文件外的全局指令,也就是啟動(dòng)nginx時(shí)設(shè)置了daemon off參數(shù),默認(rèn)參數(shù)是打開的on,是否以守護(hù)進(jìn)程的方式運(yùn)行nginx,守護(hù)進(jìn)程是指脫離終端并且在后臺(tái)運(yùn)行的進(jìn)程。這里設(shè)置為off,也就是不讓它在后臺(tái)運(yùn)行。為什么我們啟動(dòng)nginx容器時(shí)不讓它在后臺(tái)運(yùn)行呢,docker 容器默認(rèn)會(huì)把容器內(nèi)部第一個(gè)進(jìn)程,也就是pid=1的程序作為docker容器是否正在運(yùn)行的依據(jù),如果docker 容器pid掛了,那么docker容器便會(huì)直接退出。

nginx.conf 內(nèi)容

配置中主要添加了 location ~ .php這一段的內(nèi)容,其中fastcgi_pass的 lnmp_php,這個(gè)是后面啟動(dòng)php容器時(shí)的名稱。當(dāng)匹配到php的請(qǐng)求時(shí),它會(huì)轉(zhuǎn)發(fā)給lnmp_php這個(gè)容器php-fpm服務(wù)來處理。正常情況下,如果php服務(wù)不是跑在容器中,lnmp_php這個(gè)內(nèi)容一般寫php服務(wù)器的Ip地址。

build 構(gòu)建nginx鏡像

切換到nginx目錄下:

構(gòu)建:

[root@localhost nginx]# docker build  -t nginx:1.12.2

查看鏡像是否構(gòu)建成功:

2.2 PHP構(gòu)建

Dockerfile內(nèi)容

php.ini 內(nèi)容(PHP默認(rèn)的配置內(nèi)容就好,實(shí)在找不到的可以復(fù)制粘貼我的)

    [PHP]
    engine = On
    short_open_tag = Off
    asp_tags = Off
    precision = 14
    output_buffering = 4096
    zlib.output_compression = Off
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = 17
    disable_functions =
    disable_classes =
    zend.enable_gc = On
    expose_php = On
    max_execution_time = 300
    max_input_time = 300
    memory_limit = 128M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    log_errors = On
    log_errors_max_len = 1024
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    track_errors = Off
    html_errors = On
    variables_order = GPCS
    request_order = GP
    register_argc_argv = Off
    auto_globals_jit = On
    post_max_size = 32M
    auto_prepend_file =
    auto_append_file =
    default_mimetype = text/html
    always_populate_raw_post_data = -1
    doc_root =
    user_dir =
    enable_dl = Off
    file_uploads = On
    upload_max_filesize = 2M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    default_socket_timeout = 60
    [CLI Server]
    cli_server.color = On
    [Date]
    date.timezone = Asia/Shanghai
    [filter]
    [iconv]
    [intl]
    [sqlite]
    [sqlite3]
    [Pcre]
    [Pdo]
    [Pdo_mysql]
    pdo_Mysql.cache_size = 2000
    pdo_MYSQL.default_socket=
    [Phar]
    [mail function]
    SMTP = localhost
    smtp_port = 25
    mail.add_x_header = On
    [SQL]
    sql.safe_mode = Off
    [ODBC]
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    [Interbase]
    ibase.allow_persistent = 1
    ibase.max_persistent = -1
    ibase.max_links = -1
    ibase.timestampformat = %Y-%m-%d %H:%M:%S
    ibase.dateformat = %Y-%m-%d
    ibase.timeformat = %H:%M:%S
    [MySQL]
    mysql.allow_local_infile = On
    mysql.allow_persistent = On
    mysql.cache_size = 2000
    mysql.max_persistent = -1
    mysql.max_links = -1
    mysql.default_port =
    mysql.default_socket =
    mysql.default_host =
    mysql.default_user =
    mysql.default_password =
    mysql.connect_timeout = 60
    mysql.trace_mode = Off
    [MySQLi]
    mysqli.max_persistent = -1
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.cache_size = 2000
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = Off
    [OCI8]
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    [Sybase-CT]
    sybct.allow_persistent = On
    sybct.max_persistent = -1
    sybct.max_links = -1
    sybct.min_server_severity = 10
    sybct.min_client_severity = 10
    [bcmath]
    bcmath.scale = 0
    [browscap]
    [Session]
    session.save_handler = files
    session.use_strict_mode = 0
    session.use_cookies = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.referer_check =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.hash_function = 0
    session.hash_bits_per_character = 5
    url_rewriter.tags = a=href,area=href,frame=src,input=src,form=fakeentry
    [MSSQL]
    mssql.allow_persistent = On
    mssql.max_persistent = -1
    mssql.max_links = -1
    mssql.min_error_severity = 10
    mssql.min_message_severity = 10
    mssql.compatibility_mode = Off
    mssql.secure_connection = Off
    [Assertion]
    [COM]
    [mbstring]
    [gd]
    [exif]
    [Tidy]
    tidy.clean_output = Off
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir=/tmp
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    [sysvshm]
    [ldap]
    ldap.max_links = -1
    [mcrypt]
    [dba]
    [opcache]
    [curl]

build構(gòu)建php鏡像
php源碼包、php.ini、Dockerfile都準(zhǔn)備好了之后,現(xiàn)在我們可以來用docker build來構(gòu)建這個(gè)鏡像了:
切換到php目錄下:

構(gòu)建php鏡像:

[root@localhost php]# docker build  -t php:5.6.31 .

查看鏡像是否構(gòu)建成功

3.運(yùn)行容器
3.1創(chuàng)建自定義網(wǎng)絡(luò)lnmp
先創(chuàng)建一個(gè)自定義網(wǎng)絡(luò),運(yùn)行ningx、php這些容器的時(shí)候加入到lnmp網(wǎng)絡(luò)中來:

# 查看默認(rèn)網(wǎng)絡(luò):
[root@localhost php]# docker network ls
創(chuàng)建:
[root@localhost php]# docker network create lnmp

3.2創(chuàng)建php容器

創(chuàng)建容器:
[root@localhost php]# docker run -itd --name lnmp_php --network lnmp -v /app/wwwroot:/usr/local/nginx/html php:5.6.31

參數(shù)說明:

-itd: # 在容器中打開一個(gè)偽終端進(jìn)行交互操作,并在后臺(tái)運(yùn)行;
--name: # 為容器分配一個(gè)名字lnmp_php;
--network: # 為容器指定一個(gè)網(wǎng)絡(luò)環(huán)境為lnmp網(wǎng)絡(luò);
--mout: # 把宿主機(jī)的/app/wwwroot目錄掛載到容器的/usr/local/nginx/html目錄,掛載也相當(dāng)于數(shù)據(jù)持久化;
php:5.6.31: # 指定剛才構(gòu)建的php鏡像來啟動(dòng)容器;

查看php容器是否運(yùn)行:

3.3創(chuàng)建nginx容器:

創(chuàng)建容器:
[root@localhost php]# docker run -itd --name lnmp_nginx --network lnmp -p 80:80 -v /app/wwwroot:/usr/local/nginx/html nginx:1.12.2

查看容器是否運(yùn)行:

3.4測試訪問
創(chuàng)建一個(gè)index.html靜態(tài)頁面來訪問:

[root@localhost wordpress]# echo Dockerfile lnmp test > /app/wwwroot/index.html

用瀏覽器訪問宿主機(jī)的IP:

再創(chuàng)建一個(gè)index.php文件開測試:

[root@localhost wordpress]# echo <? phpinfo(); > /app/wwwroot/index.php

訪問PHP頁面:

3.5創(chuàng)建mysql容器:

[root@localhost ~]# docker run -itd --network lnmp -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6 --character-set-server=utf8
#本地沒有mysql5.6的鏡像的話,會(huì)自動(dòng)從倉庫拉取;

查看mysql容器是否啟動(dòng):

進(jìn)到mysql容器里創(chuàng)建wordpress數(shù)據(jù)庫:

查看wordpress是否創(chuàng)建成功:

Ctrl p再Ctrl q退出mysql容器,回到宿主機(jī)

3.6下載wordpress博客系統(tǒng)測試lnmp
下載wordpress文件到/app/wwwroot目錄下

wordpress文件下載地址:https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
解壓wordpress壓縮包并訪問測試:

root@localhost ~]# tar -zxvf wordpress-4.7.4-zh_CN.tar.gz

打開瀏覽器訪問:
http://容器宿主機(jī)IP/wordpress/wp-admin/setup-config.php

配置wordpress博客:

提交:

輸入信息安裝Wordpress:

七.文件遷移

可用docker save命令將鏡像保存為一個(gè)tar文件:

[root@localhost ~]# docker save nginx:1.12.2 | gzip > nginx1.12.2.tar.gz

再用docker load命令導(dǎo)入:

[root@localhost ~]# docker load < nginx.1.12.2.tar.gz

更多關(guān)于云服務(wù)器域名注冊(cè),虛擬主機(jī)的問題,請(qǐng)?jiān)L問三五互聯(lián)官網(wǎng):m.shinetop.cn

贊(0)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。郵箱:3140448839@qq.com。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明出處:三五互聯(lián)知識(shí)庫 » Docker入門及實(shí)戰(zhàn)演練(一)

登錄

找回密碼

注冊(cè)

主站蜘蛛池模板: xbox免费观看高清视频的软件| 丰满少妇呻吟高潮经历| 热久久美女精品天天吊色| 日韩不卡1卡2卡三卡网站| 一区二区三区四区国产综合| 日韩福利视频导航| 麻豆一区二区三区香蕉视频| 蜜芽久久人人超碰爱香蕉| 亚欧洲乱码视频在线专区| 国产成人精品无码片区在线观看| 久青草精品视频在线观看| 99精产国品一二三产品香蕉| 九九热在线观看精品视频| 日产国产一区二区不卡| 无码国模国产在线观看免费| 成人综合婷婷国产精品久久蜜臀| 蜜桃无码一区二区三区| 亚洲国产日韩欧美一区二区三区| 国产一区二区三区乱码在线观看 | 色国产视频| 人人妻人人澡人人爽不卡视频| 亚洲av激情久久精品人| 少妇人妻偷人精品视频| 日韩亚洲国产激情一区二区| 97欧美精品系列一区二区| 91蜜臀国产自产在线观看| 无码国模国产在线观看免费| 日韩高清亚洲日韩精品一区二区| 四虎国产精品免费久久| 黄色免费在线网址| 在线精品自拍亚洲第一区| 久久超碰97人人做人人爱| 精品人妻av中文字幕乱| 通海县| 亚洲国产精品高清久久久| 午夜DY888国产精品影院| 2020国产欧洲精品网站| av永久免费网站在线观看| 狠狠色综合网站久久久久久久| 国产精品一区中文字幕| 国产九九视频一区二区三区|