本文記錄 docker 相關知識,以備將來自己查閱
卸載
我電腦裝的是 docker-ce ,所以不能用 remove docker
sudo apt-get remove docker-ce
安裝
照着上面官網的文檔來。設置倉庫,然後
sudo apt-get update
sudo apt-get install docker-ce
centos 上安裝
https://www.cnblogs.com/yufeng218/p/8370670.html
安裝指定版本的docker
1.5.2 的kubernete 無法駕馭 我已經裝好的 18.09的 docker-ce, 查看 centos 下 docker 版本號 (docker -v) 發現是1.13.1的。
我在ubuntu下安裝 1.13.1版本的 docker
卸載原先的,我裝的 18.09的ce,需要如下卸載
sudo apt-get purge docker-ce
如果你裝的不是ce, 則 sudo apt-get remove docker 應該就可以了
然後到下面這個鏈接找到適合k8s的發行版本,我要找 1.13.1 的,翻了一頁才找到(下面有個 next 翻頁按鈕)
https://github.com/moby/moby/releases
Linux 64bits tgz: https://get.docker.com/builds/Linux/x86_64/docker-1.13.1.tgz
wget https://get.docker.com/builds/Linux/x86_64/docker-1.13.1.tgz
sudo tar --strip-components=1 -xvzf docker-1.13.1.tgz -C /usr/local/bin
常用用法
docker -v 顯示docker本身的版本號
docker version 詳細的版本號
docker images 顯示所有的 image
docker rmi imageid 刪除指定的 image
docker rmi $(docker images | grep "<none>"| awk '{print $3}') 利用grep awk 刪除某一些的images
docker tag imageid k8s.gcr.io/k8s-dns-sidecar:1.14.13 添加tag
docker rmi k8s.gcr.io/k8s-dns-sidecar:1.14.13 刪除tag
docker ps -h 顯示 ps 的幫助
docker ps 顯示當前正在運行的容器
docker ps -a 顯示所有的docker容器,沒運行的也顯示
docker ps -aq 僅以ID顯示所有容器。
docker rm $(docker ps -aq) 刪除所有的容器
docker run hello-world 運行hello-world
設置時區 + 設置共享目錄
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -ti -v ~/go/gopath/src/ete/simulator/bin:/usr/bin/wjs/conf gws
僅設置時區
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime gws
設置共享目錄
docker run -ti -v ~/go/gopath/src/ete/simulator/bin:/usr/bin/wjs/conf gws
查看容器內時間
docker exec 29ac0449c996 date
進入容器
docker exec -it containerid /bin/bash
拷貝容器的文件
docker cp 161bd2262812:/100Dev.json.data .
給容器發送消息
docker kill -s SIGINT 29ac0449c996
設置時區
ubuntu16.04下 時區是不對的,dokerfile中設置時區方法如下
# 設置時區
# 宿主機的Dockerfile 同目錄下 先執行 cp /usr/share/zoneinfo/Asia/Shanghai .
copy Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
總是提示
cp: cannot stat '/usr/share/zoneinfo/Asia/Shanghai': No such file or directory
應該是 ubuntu 16.04這個docker沒搞好。恰好我宿主機也是ubuntu的,於是我直接把宿主機的這個文件 拷貝到 image中就行了
製作容器1
源碼文件: main.go 每2秒顯示一行 hello world
// main.go
package main
import (
"fmt"
"os"
"time"
)
func main() {
fmt.Println("args:", os.Args)
for {
fmt.Println("hello world")
time.Sleep(time.Second*2)
}
}
構建出bin文件
go build -o hellogo main.go
注意 go 編譯如果使用 apline ,運行 docker 時 爲了防止出現 下面錯誤
standard_init_linux.go:190: exec user process caused "no such file or directory"
編譯的時候用下面這個環境變量, 靜態鏈接編譯golang程序
export CGO_ENABLED=0
export GO_EXTRA_BUILD_ARGS="-a -installsuffix cgo"
於是當前目錄下有2個文件。一個mian.go源碼。一個 hellogo bin文件
~/gol/docker $ ls
hellogo main.go
新建 Dockerfile 文件,內容如下
from ubuntu:16.04
COPY hellogo .
ENTRYPOINT ["/hellogo"]
然後運行, -t 指定 image的名字。 注意後面還有個 .
docker build -t hellogo .
運行結果如下
~/gol/docker $ docker run hellogo
args: [/hellogo]
hello world
hello world
-d 可以後臺運行 -p 指定暴露的端口號比如 -p 8080:8080 就會把 容器的端口號 暴露到宿主機中 ,這樣就可以直接通過宿主機的ip+端口號訪問了
docker run -d hellogo
製作容器2
把 go 源碼加到image中編譯。
#源鏡像
FROM golang:latest
#作者
MAINTAINER xx "[email protected]"
#設置工作目錄
WORKDIR $GOPATH/src/github.com/wjs
#設置時區
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
#將服務器的go工程代碼加入到docker容器中
ADD main.go $GOPATH/src/github.com/wjs
#go構建可執行文件
RUN go build .
#最終運行docker的命令
ENTRYPOINT ["./wjs"]
生成 image 並運行
docker build -t hellogo .
docker run hellogo
製作容器3
把編譯好的文件加到image中,同時加入一些庫函數
這裏假定編譯好的是gwsim 文件
from ubuntu:16.04
run mkdir /usr/bin/wjs
add gwsim /usr/bin/wjs
WORKDIR /usr/bin/wjs
add lib/ /usr/bin/wjs/lib
#run ls lib
ENV LD_LIBRARY_PATH=lib:$LD_LIBRARY_PATH.
ENTRYPOINT ["/usr/bin/wjs/gwsim"]
docker-compose 示例1
安裝compose
下載鏈接,登錄上去看看 當前的版本鏈接, 我的是ubuntu16.04 所以當前對應的是
https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
sudo chmod +x docker-compose
cli.go 編譯出 cli
ser.go 編譯出 ser
ser cli 各建一個docker,共享redis docker
利用docker-compose 統一管理
gopath 目錄下 新建了 http 目錄, (不在gopath目錄也可以,只要 http 和 其下面的 cli 和 ser目錄結構不變即可)
# docker-compose.yml for go simplie client server demo
version: '3'
services:
cli:
build: cli
ser:
build: ser
ports:
- "5555:5555"
redis:
image: "redis:alpine"
新建ser目錄 並添加 ser.go 和 Dockerfile
// ser.go
package main
import (
"net/http"
"github.com/gomodule/redigo/redis"
"fmt"
)
type Server struct {
C redis.Conn
}
func (s *Server) Dial() {
if s.C != nil {
return
}
var err error
s.C, err = redis.Dial("tcp", "redis:6379")
if err != nil {
fmt.Println(err)
}
}
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/wjs" {
return
}
s.Dial()
v, err := redis.Int(s.C.Do("get", "hits"))
if err != nil {
v = 1
s.C.Do("set", "hits", 1)
} else {
s.C.Do("set", "hits", v+1)
}
fmt.Fprintf(w, "hello world %d times", v)
}
func (s *Server) Close() {
if s.C != nil {
s.C.Close()
}
}
func main() {
handler := &Server{}
defer handler.Close()
handler.Dial()
err := http.ListenAndServe(":5555", handler)
if err != nil {
fmt.Println(err)
}
}
ser 的 Dockerfile
FROM ubuntu:16.04
COPY ser .
ENTRYPOINT ["/ser"]
新建 cli 目錄 並添加 cli.go 和 Dockerfile文件 內容如下
package main
import (
"fmt"
"time"
log "github.com/sirupsen/logrus"
"github.com/gomodule/redigo/redis"
)
func ShowString(cmd, name string, c redis.Conn) (string, error) {
v, err := redis.String(c.Do("get", name))
if (err != nil) {
log.Error(err)
}
log.Print(v)
return v, err
}
func main() {
var c redis.Conn
var err error
for {
c, err = redis.Dial("tcp", "redis:6379")
if (err != nil) {
// log.WithError(err).Error("")
log.Error(err)
} else {
break
}
time.Sleep(time.Second*2)
}
defer c.Close()
for {
time.Sleep(time.Second*3)
ShowString("get", "hits", c)
}
}
FROM ubuntu:16.04
COPY cli .
ENTRYPOINT ["/cli"]
go build cli.go go build ser.go 分別生成 ser 和 cli 文件
然後在 http 目錄 運行 docker-compose up
最後通過 http://localhost:5555/wjs 訪問即可