主頁 > 軟體設計 > 10.Docker-----安裝、初步使用、鏡像、Dockerfile常用指令、通過Dockerfile檔案封裝nginx鏡像并優化

10.Docker-----安裝、初步使用、鏡像、Dockerfile常用指令、通過Dockerfile檔案封裝nginx鏡像并優化

2021-07-23 07:21:49 軟體設計

安裝、初步使用、鏡像、Dockerfile常用指令、通過Dockerfile檔案封裝nginx鏡像并優化

  • 一、簡介
  • 二、安裝
    • 1.安裝配置
      • 倉庫配有的安裝包
      • 安裝
      • 橋接
    • 2.匯入馬里奧游戲
      • 瀏覽器訪問172.25.15.1
    • 3.洗掉
    • 4.匯入2048游戲
  • 三、鏡像
    • 1.鏡像的分層結構
    • 2.退出方式
    • 3.分層
    • 4.鏡像的構建
  • 四、Dockerfile
    • 1.常用指令
    • 2.通過Dockerfile檔案封裝nginx鏡像
  • 五、優化容器
    • 1.第一種:簡單優化,減少鏡像層數
    • 2.第二種:使用多階段構建鏡像
    • 3.第三種:更換構建鏡像,選擇最精簡的基礎鏡像

一、簡介

  • Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的 Linux或Windows 機器上,也可以實作虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面,
  • 一個完整的Docker有以下幾個部分組成:
    • DockerClient客戶端
    • Docker Daemon守護行程
    • Docker Image鏡像
    • DockerContainer容器

二、安裝

1.安裝配置

[root@server1 ~]# vim /etc/yum.repos.d/westos.repo #配置軟體倉庫
[root@server1 ~]# cat /etc/yum.repos.d/westos.repo	#查看配置
[root@server1 ~]# yum repolist 	#檢測倉庫
[root@server1 ~]# yum install -y docker-ce		#安裝docker
[root@server1 ~]# systemctl enable --now docker	#開啟docker服務,并設定為開機自啟
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@server1 ~]# docker info		#查看 

倉庫配有的安裝包

在這里插入圖片描述

安裝

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

橋接

如果docker info 出現如下錯誤
在這里插入圖片描述

[root@server1 ~]# sysctl -a | grep bridge-nf-call-iptables		#查看是1的話不用修改,也不會出現上述問題	
net.bridge.bridge-nf-call-iptables = 0		#修改為1
[root@server1 ~]# vim /etc/sysctl.d/docker.conf
[root@server1 ~]# cat /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server1 ~]# sysctl  --system
[root@server1 ~]# docker info
Registry: https://index.docker.io/v1/

在這里插入圖片描述
在這里插入圖片描述

2.匯入馬里奧游戲

## 下載馬里奧游戲
[root@server1 ~]# lftp 172.25.15.250		
lftp 172.25.15.250:~> cd pub/images/
lftp 172.25.15.250:/pub/images> get mario.tar 
207414272 bytes transferred                   
lftp 172.25.15.250:/pub/images> exit
[root@server1 ~]# ls
mario.tar
[root@server1 ~]# docker load -i mario.tar 		#將游戲匯入容器
4aeeaca5ce76: Loading layer  197.2MB/197.2MB
708fd576a927: Loading layer  208.9kB/208.9kB
90222f49bc4c: Loading layer  4.608kB/4.608kB
5f70bf18a086: Loading layer  1.024kB/1.024kB
dbe97b1b7330: Loading layer  1.536kB/1.536kB
44e5704d49fb: Loading layer  9.912MB/9.912MB
Loaded image: mario:latest
[root@server1 ~]# docker run -d --name demo -p 80:8080 mario	#運行
5ad30696ec3ce7c9efd33e5964f29333cb4dcd30e99c4d610f8195c2423f394c

在這里插入圖片描述

瀏覽器訪問172.25.15.1

在這里插入圖片描述

3.洗掉

[root@server1 ~]# docker ps -a		#查看行程,所有的  (docker ps 正在運行的)
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
5ad30696ec3c        mario               "python3 -m http.ser…"   6 minutes ago       Up 6 minutes        0.0.0.0:80->8080/tcp   demo
[root@server1 ~]# docker rm -f demo	#洗掉
demo
[root@server1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

在這里插入圖片描述

4.匯入2048游戲

##下載2048游戲
[root@server1 ~]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/
cd ok, cwd=/pub/images
lftp 172.25.15.250:/pub/images> get game2048.tar 
57176576 bytes transferred                        
lftp 172.25.15.250:/pub/images> exit
[root@server1 ~]# ls
game2048.tar  mario.tar
[root@server1 ~]# docker load -i game2048.tar 
011b303988d2: Loading layer   5.05MB/5.05MB
36e9226e74f8: Loading layer  51.46MB/51.46MB
192e9fad2abc: Loading layer  3.584kB/3.584kB
6d7504772167: Loading layer  4.608kB/4.608kB
88fca8ae768a: Loading layer  629.8kB/629.8kB
Loaded image: game2048:latest
[root@server1 ~]# docker run -d --name demo -p 80:80 game2048
6fb8beeaea6ae156afba03cca436e4b3dca01d023b7a92bb73979e41abbbc176
[root@server1 ~]# 

在這里插入圖片描述
在這里插入圖片描述

三、鏡像

1.鏡像的分層結構

容器層以下所有鏡像層都是只讀的
docker從上往下依次查找檔案
容器層保存鏡像變化的部分,并不會對鏡像本身進行任何修改
一個鏡像最多127層

2.退出方式

  • 編輯鏡像時
    • ctrl+d #退出并洗掉
    • ctrl+qp #直接退出,行程進入后臺

3.分層

[root@server1 ~]# cd /var/lib/docker/
[root@server1 docker]# docker pull busybox	#
Using default tag: latest
latest: Pulling from library/busybox
Digest: sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60
Status: Image is up to date for busybox:latest
docker.io/library/busybox:latest
[root@server1 docker]# docker run -it --name demo busybox	#運行創建一個名字為demo的容器
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch file1
/ # touch file2
/ # touch file3
/ # touch file4
/ # touch file5
/ # ls
bin    etc    file2  file4  home   root   tmp    var
dev    file1  file3  file5  proc   sys    usr
/ # 
[root@server1 docker]# docker ps		#查看正在運行的
[root@server1 docker]# docker ps -a	#所有
[root@server1 docker]# docker start demo		#啟動容器demo
[root@server1 docker]# docker container attach demo		#繼續編輯鏡像

在這里插入圖片描述
在這里插入圖片描述

[root@server1 docker]# docker commit demo demo:v1	#創建v1鏡像
[root@server1 docker]# docker commit history demo:v1	#查看V1鏡像
[root@server1 docker]# docker history busybox:latest
[root@server1 docker]# docker rmi demo:v1	#洗掉v1鏡像
[root@server1 docker]# docker images

在這里插入圖片描述
有基礎的兩層,加上編輯的一層,共三層
在這里插入圖片描述洗掉v1
在這里插入圖片描述

4.鏡像的構建

  • docker commit 構建新鏡像三部曲
    • 運行容器
    • 修改容器
    • 將容器保存為新的鏡像
  • 缺點:
    • 效率低、可重復性弱、容易出錯
    • 使用者無法對鏡像進行審計,存在安全隱患
root@server1 ~]# mkdir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# vim Dockerfile ##鏡像的構建
[root@server1 docker]# cat Dockerfile 
FROM busybox	##指定base鏡像,如果本地不存在會從遠程倉庫下載
RUN touch file1
RUN mkdir westos
[root@server1 docker]# docker build -t demo:v1 .	#創建v1
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 69593048aa3a
Step 2/3 : RUN touch file1
 ---> Running in 645634f44648
Removing intermediate container 645634f44648
 ---> eec5bb41f5d2
Step 3/3 : RUN mkdir westos
 ---> Running in 9714250c45ee
Removing intermediate container 9714250c45ee
 ---> d3da9446a2c2
Successfully built d3da9446a2c2
Successfully tagged demo:v1

[root@server1 docker]# vim Dockerfile	#再次撰寫好容器的操作
FROM demo:v1	##指定base鏡像,如果本地不存在會從遠程倉庫下載
RUN touch file2
RUN mkdir redhat
[root@server1 docker]# docker build -t demo:v2 .	#創建v2
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox	
 ---> 69593048aa3a
Step 2/3 : RUN touch file2
 ---> Running in 4ab4ecbb36c9
Removing intermediate container 4ab4ecbb36c9
 ---> a82b29235c1d
Step 3/3 : RUN mkdir redhat
 ---> Running in 312a217cc548
Removing intermediate container 312a217cc548
 ---> 57b33e754a66
Successfully built 57b33e754a66
Successfully tagged demo:v2

[root@server1 docker]# docker history demo:v1	#查看容器的層數
[root@server1 docker]# docker history demo:v2	
[root@server1 docker]# docker images	#查看有幾個容器

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

四、Dockerfile

1.常用指令

用來提交創建鏡像

FROM		#指定base鏡像,如果本地不存在會從遠程倉庫下載,
MAINTAINER	#設定鏡像的作者,比如用戶郵箱等,

COPY
#把檔案從build context復制到鏡像
#支持兩種形式:COPY src dest 和 COPY ["src", "dest"]
#src必須指定build context中的檔案或目錄

ADD
#用法與COPY類似,不同的是src可以是歸檔壓縮檔案,檔案會被自動解壓到dest,也可以自動下載URL并拷貝到鏡像:
#ADD html.tar /var/www
#ADD http://ip/html.tar /var/www

ENV
#設定環境變數,變數可以被后續的指令使用:
#ENV HOSTNAME sevrer1.example.com

EXPOSE
#如果容器中運行應用服務,可以把服務埠暴露出去:
EXPOSE 80

VOLUME
#申明資料卷,通常指定的是應用的資料掛在點:
VOLUME ["/var/www/html"]

WORKDIR
#為RUN、CMD、ENTRYPOINT、ADD和COPY指令設定鏡像中的當前作業目錄,如果目錄不存在會自動創建,

RUN
# 在容器中運行命令并創建新的鏡像層,常用于安裝軟體包:
RUN yum install -y vim

CMD 與 ENTRYPOINT
#這兩個指令都是用于設定容器啟動后執行的命令,但CMD會被docker run后面的命令列覆寫,而ENTRYPOINT不會被忽略,一定會被執行,
#docker run后面的引數可以傳遞給ENTRYPOINT指令當作引數,
#Dockerfile中只能指定一個ENTRYPOINT,如果指定了很多,只有最后一個有效,

Shell和exec格式的區別
# cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT echo "hello, $name"


Shell格式底層會呼叫/bin/sh -c來執行命令,可以決議變數,而下面
的exec格式不會:
# cat Dockerfile
FROM busybox
ENV name world
ENTRYPOINT ["/bin/echo", "hello, $name"]

2.通過Dockerfile檔案封裝nginx鏡像

[root@server1 ~]# cd docker/

## 1.下載nginx安裝包
[root@server1 docker]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/docs/lamp/
lftp 172.25.15.250:/pub/docs/lamp> get nginx-1.20.1.tar.gz 
1061461 bytes transferred
lftp 172.25.15.250:/pub/docs/lamp> exit
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz

## 2.軟體倉庫的配置
[root@server1 docker]# cp /etc/yum.repos.d/westos.repo .
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz  westos.repo
[root@server1 docker]# cat westos.repo 
[wan]
name="wan"
baseurl=http://172.25.15.250/rhel7
gpgcheck=0
[docker]
name=docker
baseurl=ftp://172.25.15.250/pub/docs/docker/docker-ce
gpgcheck=0

## 3.下載rhel7鏡像
[root@server1 docker]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/
lftp 172.25.15.250:/pub/images> get rhel7.tar 
147112448 bytes transferred                   
lftp 172.25.15.250:/pub/images> exit
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz  rhel7.tar  westos.repo

在這里插入圖片描述
在這里插入圖片描述

## 4.匯入鏡像,封裝
[root@server1 docker]# docker load -i rhel7.tar 	#匯入
e1f5733f050b: Loading layer  147.1MB/147.1MB
[root@server1 docker]# vim Dockerfile 	#撰寫Dockerfile
[root@server1 docker]# cat Dockerfile 
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t rhel7:v1 .	#封裝容器rhel7:v1
[root@server1 docker]# docker run -d --name rhel7 rhel7:v1	#運行
[root@server1 docker]# docker inspect rhel7	#查看容器資訊
[root@server1 docker]# cd /var/lib/docker/volumes	/9b855292b296fd0d4fe423342e52dc5ea5d9d190e7ab9cf131ceef7f95637577/_data	#進入目錄
[root@server1 _data]# ls
[root@server1 _data]# echo www.jwl.org > index.html	#撰寫nginx默認發布檔案
[root@server1 _data]# curl 172.17.0.2		#訪問查看
www.jwl.org
[root@server1 _data]# 

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

[root@server1 _data]# docker images

在這里插入圖片描述
我們看到封裝好的v1有303MB,對于企業來說過大,因此我們要進行優化,

五、優化容器

1.第一種:簡單優化,減少鏡像層數

清理鏡像構建的中間產物

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM rhel7 as build
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 && yum remove -y gcc make &&  yum clean all
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t rhel7:v2 .
[root@server1 docker]# docker run -d --name rhel7.1 rhel7:v2	#換個名稱運行
[root@server1 docker]# docker images	#查看所有容器
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v2                  f3c552fd7ff4        3 minutes ago       233MB		#和v1比較少了130MB
rhel7               v1                  a8e39b9ae36a        46 minutes ago      303MB	#未優化
rhel7               latest              0a3eb3fde7fd        7 years ago         140MB	#原始鏡像
[root@server1 docker]# 

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

2.第二種:使用多階段構建鏡像

[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM rhel7 as build
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.20.1 && yum remove -y gcc make &&  yum clean all

FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t rhel7:v3 .
[root@server1 docker]# docker run -d --name rhel7.2 rhel7:v3
736cd619254c4c157d8402144fff6f15628c56c5b79c571d9b7f321934c77b50
[root@server1 docker]# docker images		#V3相比v1和v2更小
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
rhel7               v3                  186d48c6f99a        40 seconds ago      144MB	##使用多階段構建鏡像 縮減到了144M,但還是比nginx官方鏡像133M大很多
rhel7               v2                  f3c552fd7ff4        8 minutes ago       233MB	##減少鏡像層數,清理鏡像構建的中間產物
rhel7               v1                  a8e39b9ae36a        51 minutes ago      303MB	#未優化
rhel7               latest              0a3eb3fde7fd        7 years ago         140MB	#原始鏡像

在這里插入圖片描述
在這里插入圖片描述

3.第三種:更換構建鏡像,選擇最精簡的基礎鏡像

##1.下載鏡像
[root@server1 docker]# ls
Dockerfile  nginx-1.20.1.tar.gz  rhel7.tar  westos.repo
[root@server1 docker]# lftp 172.25.15.250
lftp 172.25.15.250:~> cd pub/images/  
lftp 172.25.15.250:/pub/images> get base-debian10.tar 
20818944 bytes transferred                             
lftp 172.25.15.250:/pub/images> exit 
[root@server1 docker]# ls
base-debian10.tar  Dockerfile  nginx-1.20.1.tar.gz  rhel7.tar  westos.repo
[root@server1 docker]# docker load -i base-debian10.tar
de1602ca36c9: Loading layer  3.041MB/3.041MB
1d3b68b6972f: Loading layer  17.77MB/17.77MB
Loaded image: gcr.io/distroless/base-debian10:latest
[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
rhel7                             v3                  186d48c6f99a        6 minutes ago       144MB
rhel7                             v2                  f3c552fd7ff4        14 minutes ago      233MB
rhel7                             v1                  a8e39b9ae36a        57 minutes ago      303MB
rhel7                             latest              0a3eb3fde7fd        7 years ago         140MB
gcr.io/distroless/base-debian10   latest              d48fcdd54946        51 years ago        19.2MB

## 2.封裝
[root@server1 docker]# vim Dockerfile 
[root@server1 docker]# cat Dockerfile 
FROM nginx:latest as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE
RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /usr/sbin/nginx-debug /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
FROM gcr.io/distroless/base-debian10
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]

[root@server1 docker]# docker build -t rhel7:v4 .
[root@server1 docker]# docker run -d --name rhel7.3 rhel7:v4
19cef46b199993e6d1b53da00ad7227170095ef1323e44f5ccb6c16472bceb7e
[root@server1 docker]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED              SIZE
rhel7                             v4                  dc3e62941331        About a minute ago   31.9MB	#更換鏡像,選擇最精簡的基礎鏡像
rhel7                             v3                  186d48c6f99a        13 minutes ago       144MB	#使用多階段構建鏡像 縮減到了144M,但還是比nginx官方鏡像133M大很多
rhel7                             v2                  f3c552fd7ff4        20 minutes ago       233MB	#減少鏡像層數,清理鏡像構建的中間產物
rhel7                             v1                  a8e39b9ae36a        About an hour ago    303MB	#未優化
nginx                             latest              4cdc5dd7eaad        13 days ago          133MB
rhel7                             latest              0a3eb3fde7fd        7 years ago          140MB	#原始鏡像
gcr.io/distroless/base-debian10   latest              d48fcdd54946        51 years ago         19.2MB
[root@server1 docker]# 

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289531.html

標籤:其他

上一篇:Tencent SSL 數字證書安裝部署

下一篇:OSI七層模型和TCP/IP四層(TCP與UDP)(筆記)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more