docker啓動gitlab,Docker 命令與映射修改,VNC Timed out waiting for a response from the computer

ps:我用的是本地自己搭建的私有倉庫,所以下載鏡像爲本地地址,如果自己沒有本地倉庫的可以去官方下載,官方也是有這個鏡像的,pull之前可以先docker search gitlab查看一下gitlab的一個鏡像

下載鏡像:

docker pull 192.168.0.153:5000/gitlab

創建持久化目錄:

mkdir -p /home/dockerdata/gitlab/config

mkdir -p /home/dockerdata/gitlab/logs

mkdir -p /home/dockerdata/gitlab/data

容器內Gitlab使用端口:

Ssh 22

http 80

https 443

映射到宿主機端口:

Ssh 1022

http 8010

https:8443

注意:如果要使用宿主機的22和443端口,需要修改宿主機的ssh和https的默認端口。例如修改ssh端口爲1022

  Ubuntu 下沒啓用 seLinux ,如果啓用了需要先 

  apt install policycoreutils-python-utils

  apt install firewalld

  否則不需要。

semanage port -a -t ssh_port_t -p tcp 1022

firewall-cmd --permanent --add-port=1022/tcp

firewall-cmd --reload

運行gitlab鏡像:

docker run -d -h gitlab -p 1022:22 -p 8010:80 -p 8443:443 \

   -v /home/dockerdata/gitlab/config:/etc/gitlab \

   -v /home/dockerdata/gitlab/logs:/var/log/gitlab \

   -v /home/dockerdata/gitlab/data:/var/opt/gitlab \

   --restart always --name mygitlab gitlab/gitlab-ce:latest

官方的腳本:

sudo docker run --detach \
    --hostname gitlab.example.com \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

 

容器中的gitlab完全啓動需要一定時間,可通過日誌命令實時查看啓動進度:

$ docker logs -f <container id>

啓動完全完成之後訪問http://<ip>:8010

 

可以先查看一下端口占用情況:

1.netstat  -anp  |grep   端口號

2.netstat   -nultp(此處不用加端口號)

3.netstat  -anp  |grep  82查看82端口的使用情況;

修改運行中的docker容器的端口映射

  在docker run創建並運行容器的時候,可以通過-p指定端口映射規則。但是,我們經常會遇到剛開始忘記設置端口映射或者設置錯了需要修改。當docker start運行容器後並沒有提供一個-p選項或設置,讓你修改指定端口映射規則。那麼這種情況我們該怎麼處理呢?今天Docker君教你如何修改運行中的docker容器的端口映射?

方法一:刪除原有容器,重新建新容器

這個解決方案最爲簡單,把原來的容器刪掉,重新建一個。當然這次不要忘記加上端口映射。

    優缺點:優點是簡單快捷,在測試環境使用較多。缺點是如果是數據庫鏡像,那重新建一個又要重新配置一次,就比較麻煩了。

方法二:修改容器配置文件,重啓docker服務

容器的配置文件路徑:

  1. /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json

    其中的hashofthecontainer是docker鏡像的hash值,可以通過docker ps或者docker inspect containername查看。(CONTAINER ID就可以看出來)

 

    如上圖,文件中其中有一項是PortBindings,其中8080/tcp對應的是容器內部的8080端口,HostPort對應的是映射到宿主機的端口9190。8361/tcp對應的是容器內部的8361端口,HostPort對應的是映射到宿主機的端口9191。按需修改端口,然後重啓docker服務,再啓動容器服務就可以了。

  1. systemctl restart docker

    優缺點:這個方法的優點是沒有副作用,操作簡單。缺點是需要重啓整個docker服務,如果在同一個宿主機上運行着多個容器服務的話,就會影響其他容器服務。

 

方法三:利用docker commit新構鏡像

    docker commit:把一個容器的文件改動和配置信息commit到一個新的鏡像。這個在測試的時候會非常有用,把容器所有的文件改動和配置信息導入成一個新的docker鏡像,然後用這個新的鏡像重起一個容器,這對之前的容器不會有任何影響。

1、停止docker容器

  1. docker stop container01

2、commit該docker容器

  1. docker commit container01 new_image:tag

3、用前一步新生成的鏡像重新起一個容器

  1. docker run --name container02 -p 80:80 new_image:tag

    優缺點:這種方式的優點是不會影響統一宿主機上的其他容器,缺點是管理起來顯得比較亂,沒有第二種方法那麼直觀。

Docker命令列表

容器生命週期管理

  • run 創建一個新的容器並運行一個命令
     docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • start/stop/restart 啓動/停止/重啓容器 
     docker start [OPTIONS] CONTAINER [CONTAINER...]
  • kill 殺掉一個運行中的容器   

     docker kill [OPTIONS] CONTAINER [CONTAINER...] 

  • rm 刪除一個或多個容器
      docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • pause/unpause 暫停/恢復容器中所有的進程
      docker pause [OPTIONS] CONTAINER [CONTAINER...]
  • create 創建一個新的容器但不啓動它
     docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
  • exec 在運行的容器中執行命令啓動新進程(一般用以監控或查詢)
      docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

容器操作

  • ps 列出容器
      docker ps [OPTIONS]
  • inspect 獲取容器/鏡像的元數據
        docker inspect [OPTIONS] NAME|ID [NAME|ID...]
  • top 查看容器中運行的進程信息,支持 ps 命令參數
        docker top [OPTIONS] CONTAINER [ps OPTIONS]
  • attach 連接到正在運行中的容器
        docker attach [OPTIONS] CONTAINER
  • events 從服務器獲取實時事件
        docker events [OPTIONS]
  • logs 獲取容器的日誌
        docker logs [OPTIONS] CONTAINER

     (-t日誌添加時間戳  -f跟蹤日誌變動 --tail n/all從倒數n條處打印)

  • wait 阻塞運行直到容器停止,然後打印出它的退出代碼
        docker wait [OPTIONS] CONTAINER [CONTAINER...]
  • export 將文件系統作爲一個tar歸檔文件導出到STDOUT
        docker export [OPTIONS] CONTAINER
  • port 列出指定的容器的端口映射,或者查找將PRIVATE_PORT NAT到面向公衆的端口
        docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

容器rootfs命令

  • commit 從容器創建一個新的鏡像【像代碼版本控制一樣控制業務系統及其環境的版本】
        docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

      (-a 作者 -m 註釋 )

  • cp 用於容器與主機之間的數據拷貝
        docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|
        docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  • diff 檢查容器裏文件結構的更改
        docker diff [OPTIONS] CONTAINER

鏡像倉庫

  • login/logout 登陸/註銷到一個Docker鏡像倉庫
        docker login -u 用戶名 -p 密碼 [SERVER]
        docker logout
  • pull 從鏡像倉庫中拉取或者更新指定鏡像
        docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • push 將本地的鏡像上傳到鏡像倉庫,要先登陸到鏡像倉庫
        docker push [OPTIONS] NAME[:TAG]
  • search 從Docker Hub查找鏡像
        docker search [OPTIONS] TERM 

本地鏡像管理

  • images 列出本地鏡像
        docker images [OPTIONS] [REPOSITORY[:TAG]]
  • rmi 刪除本地一個或多個鏡像
        docker rmi [OPTIONS] IMAGE [IMAGE...]
  • tag 標記本地鏡像,將其歸入某一倉庫
        docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
  • build 使用Dockerfile構建鏡像
        docker build [OPTIONS] PATH | URL |

    (OPTIONS說明:

        --build-arg=[] :設置鏡像創建時的變量;
        --cpu-shares :設置 cpu 使用權重;
        --cpu-period :限制 CPU CFS週期;
        --cpu-quota :限制 CPU CFS配額;
        --cpuset-cpus :指定使用的CPU id;
        --cpuset-mems :指定使用的內存 id;
        --disable-content-trust :忽略校驗,默認開啓;
        -f :指定要使用的Dockerfile路徑;
        --force-rm :設置鏡像過程中刪除中間容器;
        --isolation :使用容器隔離技術;
        --label=[] :設置鏡像使用的元數據;
        -m :設置內存最大值;
        --memory-swap :設置Swap的最大值爲內存+swap,"-1"表示不限swap;
        --no-cache :創建鏡像的過程不使用緩存;
        --pull :嘗試去更新鏡像的新版本;
        -q :安靜模式,成功後只輸出鏡像ID;
        --rm :設置鏡像成功後刪除中間容器;
        --shm-size :設置/dev/shm的大小,默認值是64M;
        --ulimit :Ulimit配置

      )

  • history 查看指定鏡像的構建過程
        docker history [OPTIONS] IMAGE
  • save/load 將指定鏡像保存成 tar 文件/將tar文件恢復成鏡像
        docker save [OPTIONS] IMAGE [IMAGE...] #鏡像備份
      docker load -i TAR.tar  #鏡像恢復
   (-o :輸出到的文件)
  • import/export 從歸檔文件中構建鏡像/將鏡像導出【export導出會丟失構建歷史無法回滾,save會保留構建歷史】
        docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

      docker export -o PATH_TO_EXPORT_FILE CONTAINER

info|version

  • info 顯示 Docker 系統信息,包括鏡像和容器數
        docker info [OPTIONS]
  • version 顯示 Docker 版本信息
        docker version [OPTIONS]

     

[注]docker命令是可以嵌套的,如 docker rmi $(docker images -q ubuntu)是刪除ubuntu倉庫中的所有鏡像

 

使用docker 出現Error response from daemon: Conflict. The container name “***” is already in use

解決方法:

(1)給容器換一個名字, 比如說 docker run -it --name=mycentos2 centos:7 /bin/bash, 可以解決問題.
(2)將原來的容器刪除

    • 查詢當前容器:docker container ls -all
      在這裏插入圖片描述
    • 刪除當前容器:docker container rm mycentos(提示: 這一步要確定刪除容器沒問題的情況下, 纔可以做)
      在這裏插入圖片描述

查看docker的端口映射情況

iptables -t nat -nL --line-number

添加端口映射
查看容器靜態ip

docker inspect `container_name` | grep IPAddress

添加端口
將容器的8000端口映射到docker主機的8001端口

iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.1

查看添加情況

iptables -nL

gitlab 默認佔用80端口,安裝過nginx的,改下配置 。

netstat  -tln

查看到80端口被打開了,處於監聽的服務狀態。目的:不再讓80端口開放。以免整個ip被誤殺。

使用

service nginx stop

運行中沒有報錯。

之後再運行

netstat -tln

查看到80端口已經被關閉了。

VNC Timed out waiting for a response from the computer

apt install xinetd telnet telnet-server -y

服務器上使用 netstat -na | grep 5901  命令查看,服務端口也在監聽狀態;(或 5900)

然後在服務器上安裝了 Telnet,嘗試使用內網IP連接成功,但使用外網IP就不行;

最後看到一篇文章提到這個問題,需要添加防火牆規則;

解決方法:

sudo /sbin/iptables -I INPUT 1 -p TCP --dport 5900:5910 -j ACCEPT

或者直接修改文件/etc/sysconfig/iptables文件,添加一行:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 5901:5910 -j ACCEPT

重啓iptables服務:

service iptables restart

如果沒有iptables.service文件,使用yum安裝一下:yum install iptables-services (centos下)

sudo /sbin/iptables -I INPUT 1 -p TCP --dport 5901:5910 -j ACCEPT

防火牆也不需要重啓,也沒執行 flush privileges,再用VNC客戶端一連接,發現連接上了。

Ubuntu默認防火牆安裝、啓用、配置、端口、查看狀態相關信息

自打2.4版本以後的Linux內核中, 提供了一個非常優秀的防火牆工具。這個工具可以對出入服務的網絡數據進行分割、過濾、轉發等等細微的控制,進而實現諸如防火牆、NAT等功能。一般使用名氣比較的大iptables等程序對這個防火牆的規則進行管理。

  iptables可以靈活的定義防火牆規則, 功能非常強大。但是由此產生的副作用便是配置過於複雜。一向以簡單易用著稱Ubuntu在它的發行版中,附帶了一個相對iptables簡單很多的防火牆 配置工具:ufw。

  ufw防火牆 即uncomplicated firewall的簡稱,不復雜的防火牆,繁瑣部分的設置還是需要去到iptables,已經支持界面操作了。在命令行運行ufw命令就可以看到提示的一系列可進行的操作。

 

最簡單的一個操作:

sudo ufw status(如果你是root,則去掉sudo,ufw status)可檢查防火牆的狀態,我的返回的是:inactive(默認爲不活動)。
sudo ufw version防火牆版本:
ufw 0.29-4ubuntu1
Copyright 2008-2009 Canonical Ltd.
ubuntu 系統默認已安裝ufw.

 

1.安裝

sudo apt-get install ufw

2.啓用

sudo ufw enable
sudo ufw default deny
運行以上兩條命令後,開啓了防火牆,並在系統啓動時自動開啓。關閉所有外部對本機的訪問,但本機訪問外部正常。

3.開啓/禁用

sudo ufw allow|deny [service]
打開或關閉某個端口,例如:
sudo ufw allow smtp 允許所有的外部IP訪問本機的25/tcp (smtp)端口
sudo ufw allow 22/tcp 允許所有的外部IP訪問本機的22/tcp (ssh)端口
這個很重要,ssh遠程登錄用於SecureCRT等軟件建議開啓。或者不要開防火牆。
sudo ufw allow 53 允許外部訪問53端口(tcp/udp)
sudo ufw allow from 192.168.1.100 允許此IP訪問所有的本機端口
sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53
sudo ufw deny smtp 禁止外部訪問smtp服務
sudo ufw delete allow smtp 刪除上面建立的某條規則

4.查看防火牆狀態

sudo ufw status
一般用戶,只需如下設置:
sudo apt-get install ufw
sudo ufw enable
sudo ufw default deny
以上三條命令已經足夠安全了,如果你需要開放某些服務,再使用sudo ufw allow開啓。
開啓/關閉防火牆 (默認設置是’disable’)
sudo ufw enable|disable
轉換日誌狀態
sudo ufw logging on|off
設置默認策略 (比如 “mostly open” vs “mostly closed”)
sudo ufw default allow|deny
許 可或者屏蔽端口 (可以在“status” 中查看到服務列表)。可以用“協議:端口”的方式指定一個存在於/etc/services中的服務名稱,也可以通過包的meta-data。 ‘allow’ 參數將把條目加入 /etc/ufw/maps ,而 ‘deny’ 則相反。基本語法如下:
sudo ufw allow|deny [service]
顯示防火牆和端口的偵聽狀態,參見 /var/lib/ufw/maps。括號中的數字將不會被顯示出來。
sudo ufw status
UFW 使用範例:
允許 53 端口
$ sudo ufw allow 53
禁用 53 端口
$ sudo ufw delete allow 53
允許 80 端口
$ sudo ufw allow 80/tcp
禁用 80 端口
$ sudo ufw delete allow 80/tcp
允許 smtp 端口
$ sudo ufw allow smtp
刪除 smtp 端口的許可
$ sudo ufw delete allow smtp
允許某特定 IP
$ sudo ufw allow from 192.168.254.254
刪除上面的規則
$ sudo ufw delete allow from 192.168.254.254
linux 2.4內核以後提供了一個非常優秀的防火牆工具:netfilter/iptables,他免費且功能強大,可以對流入、流出的信息進行細化控制,它可以 實現防火牆、NAT(網絡地址翻譯)和數據包的分割等功能。netfilter工作在內核內部,而iptables則是讓用戶定義規則集的表結構。

但是iptables的規則稍微有些“複雜”,因此ubuntu提供了ufw這個設定工具,以簡化iptables的某些設定,其後臺仍然是 iptables。ufw 即uncomplicated firewall的簡稱,一些複雜的設定還是要去iptables。

ufw相關的文件和文件夾有:

/etc /ufw/:裏面是一些ufw的環境設定文件,如 before.rules、after.rules、sysctl.conf、ufw.conf,及 for ip6 的 before6.rule 及 after6.rules。這些文件一般按照默認的設置進行就ok。

若開啓ufw之 後,/etc/ufw/sysctl.conf會覆蓋默認的/etc/sysctl.conf文件,若你原來的/etc/sysctl.conf做了修 改,啓動ufw後,若/etc/ufw/sysctl.conf中有新賦值,則會覆蓋/etc/sysctl.conf的,否則還以/etc /sysctl.conf爲準。當然你可以通過修改/etc/default/ufw中的“IPT_SYSCTL=”條目來設置使用哪個 sysctrl.conf.

/var/lib/ufw/user.rules 這個文件中是我們設置的一些防火牆規則,打開大概就能看明白,有時我們可以直接修改這個文件,不用使用命令來設定。修改後記得ufw reload重啓ufw使得新規則生效。

下面是ufw命令行的一些示例:

ufw enable/disable:打開/關閉ufw
ufw status:查看已經定義的ufw規則
ufw default allow/deny:外來訪問默認允許/拒絕
ufw allow/deny 20:允許/拒絕 訪問20端口,20後可跟/tcp或/udp,表示tcp或udp封包。
ufw allow/deny servicename:ufw從/etc/services中找到對應service的端口,進行過濾。
ufw allow proto tcp from 10.0.1.0/10 to 本機ip port 25:允許自10.0.1.0/10的tcp封包訪問本機的25端口。
ufw delete allow/deny 20:刪除以前定義的"允許/拒絕訪問20端口"的規則

ubuntu中防火牆iptables配置

1.查看系統是否安裝防火牆

root@localhost:/usr# which iptables
/sbin/iptables
root@localhost:/usr# whereis iptables
iptables: /sbin/iptables /etc/iptables /usr/share/iptables /usr/share/man/man8/iptables.8.gz

如果是這樣的信息,那麼表明iptables就是安裝了的。
如果沒有安裝,那麼使用sudo apt-get install iptables 安裝。

2.查看防火牆的配置信息

配置好了的,是這個樣子。

root@localhost:/usr# sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt: 22
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:http
ACCEPT     icmp --  anywhere             anywhere             limit: avg 100/sec burst 100
ACCEPT     icmp --  anywhere             anywhere             limit: avg 1/sec burst 10
syn-flood  tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain syn-flood (1 references)
target     prot opt source               destination
RETURN     tcp  --  anywhere             anywhere             limit: avg 3/sec burst 6
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

3.新建規則文件

mkdir /etc/iptables #先新建目錄,本身無此目錄

vim /etc/iptables/rules.v4

/etc/iptables/rules.v4 中的內容是

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:syn-flood - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
-A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
-A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
-A syn-flood -j REJECT --reject-with icmp-port-unreachable
COMMIT

4.使防火牆生效

iptables-restore < /etc/iptables/rules.v4

5.創建文件,添加以下內容,使防火牆開機啓動

vim /etc/network/if-pre-up.d/iptables
#!/bin/bash
iptables-restore < /etc/iptables/rules.v4

6.添加執行權限

chmod +x /etc/network/if-pre-up.d/iptables

7.查看規則是否生效

iptables -L -n

Ubuntu中沒有直接停止關閉iptables的命令,像service iptables stop這類命令,是centos纔有的。關閉的話,可以暫時開放所有端口作爲替代方案

iptables -P INPUT ACCEPT  
iptables -P OUTPUT ACCEPT  

 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章