20 Temmuz 2020 Pazartesi

docker


Reference
Repository + tag anlamına gelir. Eğer sadece repositroy verirsek tag olarak latest kullanılır

Union FileSystem
Docker image'ları birbirlerinden kalıtır gibi düşünülebilir. Böylece ortak bir atadan kalıtan image'lar aynı JDK'yı kullanabilir.

Docker Daemon
Dokcer Daemon yazısına taşıdım

Docker-level commands
build
docker build Seçeneği yazısına taşıdım.

container seçeneği
container seçeneği yazısına taşıdım.

commit seçeneği
Şöyle yaparız. Temel image üzerine paket kurduktan sonra saklanmasını sağlar.
docker commit your_modified_container_name [REPOSITORY[:TAG]]
--cap-add
Linux yeteneklerini atamak için kullanılır.

-e 
Ortam değişkenine değer atamak için kullanılır. Şöyle yaparız.
docker run -e var=value
images seçeneği
docker images Seçeneği yazısına taşıdım

inspect seçeneği
Şöyle yaparız.

--name seçeneği
Taşıyıcıya isim vermek için şöyle yaparız.
docker run --cap-add=IPC_LOCK -e '...' -p8201:8200 --name vault-server
 -v/tmp/vault-conf/ca-keys:/vault/ca
vault server
ps
docker ps Seçeneği yazısına taşıdım

pull seçeneği
Belirtilen isme sahip image dosyasını indirir. Şöyle yaparız.
docker pull mysql
run seçeneği
docker run Seçeneği yazısına taşıdım.

-v seçeneği
Belirtilen dizini docker'a dahil eder.
Örnek
Kendi makinemdeki /home/acelya/Downloads docker'da /home/Downloads olarak görünür. Şöyle yaparız.
docker run -v /home/acelya/Downloads:/home/Downloads/ -h debian7
-p 8081:8080 -itd --name acelya debian:7
Örnek
docker'ı çalıştırmadan önce kendi makinemdeki node dizininde iki tane dosya mevcut. Docker'a node dizinini tanıttıktan sonra yine aynı dosyaları görebilirim. Şöyle yaparız.
$
$ls node
index.js  node_modules
$
$docker run -ti --rm -v $(pwd)/node:/node lyft/envoy:latest /bin/bash
root@94cde9bd4114:/# cd node
root@94cde9bd4114:/node# ls
root@94cde9bd4114:/node# ls -a
Container-specific commands
Giriş
komutla beraber [container name/ID] şeklinde çalışan bir taşıyıcı belirtilir.

exec seçeneği
docker exec Seçeneği yazısına taşıdım.

inpect seçeneği
Belirtilen isme sahip taşıyıcının konfigürasyon bilgisini gösterir.

logs seçeneği
docker logs seçeneği yazısına taşıdım

network seçeneği
docker network Seçeneği yazısına taşıdım

-p seçeneği
Belirtilen isme sahip taşıyıcı ile bilgisayar arasındaki port forwarding bilgisini gösterir. Docker normalde kendi ethernet arayüzünü kullanır. Açıklaması şöyle.
Whenever you start your container it will assign ip address from docker0 interface.It will be different from your actual ip address. By default docker container will start with docker0 interface ip address like 172.17.0.1.
Ana makinenin fiziksel arayüzünü kullansın istersek şöyle yaparız.
docker run -it -d -h $hostname -p 8085:8085 javay
--priviledged
Açıklaması şöyle.
Full container capabilities (--privileged)
The --privileged flag gives all capabilities to the container, and it also lifts all the limitations enforced by the device cgroup controller. In other words, the container can then do almost everything that the host can do. This flag exists to allow special use-cases, like running Docker within Docker.
Şöyle yaparız.
$ docker run -it --rm --privileged --network=mybridge xxx bash
stats seçeneği
Belirtilen isme sahip taşıyıcı hakkında bilgi gösterir.

stop seçeneği
docker stop Seçeneği yazısına taşıdım

version seçeneği
Şöyle yaparız
$docker -v
Docker version 19.03.12, build 48a66213fe
volume seçeneği
docker volume Seçeneği yazısına taşıdım

tmux komutu Terminal Multiplexer

Giriş
Uzun süren işlemlerde (long running process) kullanılıyor. Açıklaması şöyle
tmux is a program which runs in a terminal and allows multiple other terminal programs to be run inside it. Each program inside tmux gets its own terminal managed by tmux, which can be accessed from the single terminal where tmux is running 
screen komutu yerine tmux kullanlabilir. Açıklaması şöyle.
tmux (and before it, I used screen) is the defacto standard for terminal multiplexing, and keeping things running after you logout.
Kullanım
Açıklaması şöyle
1. Uzaktaki bir bilgisayara SSH ile bağlanırız.
2. Uzaktaki bir bilgisayarda tmux  ile uygulamayı çalıştırırız.
3. SSH bağlantısı kopsa bile tmux çalışmaya devam eder. Uzaktaki makineye tekrar bağlanıp tmux'a tekrar oturum açabiliriz.
One of the biggest benefits of using tmux is that you can detach or pause sessions. This means that if you SSH into a remote machine, start a tmux session and then interrupt your connection, you won’t get the dreaded frozen console. Your session will still end and you’ll need to reconnect, but once reattached to the session all your work will be right where you left it.
Örnek
Şöyle yaparız
# start a new session
tmux new-session -s my_session

# Now press CTRL + b then d. This will detach from the session manually. 
# You can see your paused session by executing
tmux ls

# If you want to reattach to it you can run
tmux a -t my_session
ls seçeneği
Örnek 
Şöyle yaparız
> tmux ls
0: 1 windows (created Sat Jul 10 13:47:36 2021) (attached)
has-session seçeneği
Açıklaması şöyle
has-session [-t target-session]
(alias: has)

Report an error and exit with 1 if the specified session does not exist. If it does exist, exit with 0.
Örnek
Şöyle yaparız
if tmux has-session 2>/dev/null; then
    echo session exists
else
    echo no sessions
fi

xargs komutu

Giriş
xargs pipe ile verilen çıktıyı her satır için çalıştırır. xargs ile komutlar paralelleştirme imkanı vardır.

Exist Status
Açıklaması şöyle
0 if it succeeds
123 if any invocation of the command exited with status 1-125
124 if the command exited with status 255
125 if the command is killed by a signal
126 if the command cannot be run
127 if the command is not found
1 if some other error occurred.
Örnek
Elimizde şöyle bir komut olsun. history bir built-in komut olduğu için xargs bu komutu bulamaz ve 127 döner.
echo 1 | xargs history -d; echo $?
argument list too long
argument list too long hatası alıyorsak xargs ile durumu düzeltebiliriz. 

Örnek
Mesela her .gz dosyasını gunzip ile açmak istiyoruz ancak çok fazla dosya varsa, shell bize bu komut için hata veriyorsa
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
Şöyle düzeltebiliriz. Burada gunzip komutu arka arkaya bir sürü dosya ismi alabildiği için sorun çıkmıyor.
find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
Örnek
Şöyle yaparız. find komutu -print0 ile kullanılıyor. Her dosya ismi 0 karakteri ile biter. xargs ta -0 ile kullanıyor. Dosya isimleri arasında 0 karakteri olduğunu belirtiriz. Burada doit scripti  arka arkaya bir sürü dosya ismi ile çağrılır
find /path/to/files -type f -print0 | \
    xargs -0 -r $HOME/bin/doit
Script'in şöyle olması gerekir.
#!/bin/bash
while [[ $# -ne 0 ]] ; do
    thisfile="$1"
    shift
    dos2unix -k -n "$thisfile" tmp_file
    mv tmp_file "$thisfile"
done
Dosya isminin Konumu - {} karakterleri
Konum tanımlamazsak satırı komutun sonuna ekler.

find . -name *.cpp | xargs rm -rf

Konum tanımlamak için {} kullanılır. Örnek:
ls -tr | tail -n 3 | xargs -I{} mv {} /home/user/Desktop
-d seçeneği - delimeter
Input delimeter'ın ne olacağını belirtir.
Örnek
Açıklaması şöyle.
-d'\n' tells xargs to treat each line of input as a separate file name.
Her satıra karşılık gelen dosya açmak için şöyle yaparız
xargs -d '\n' touch -- < path/to/ls.txt
Örnek
İlk 4 satırı tek satır haline getirmek için şöyle yaparız.
xargs -d '\n' -n4 < inputfile.txt
-i[replace-str], --replace[=replace-str] seçeneği
Açıklaması şöyle.
This option is a synonym for -I replace-str if replace-str is specified. If the replace-str argument is missing, the effect is the same as -I{}. This option is deprecated; use -I instead.
-I seçeneği - replace str
Açıklaması şöyle.
Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
Pipe ile verilen çıktıyı satırlara böler. tail gibi programlar satırları kendileri bölmediği için gerekebilir.

-I {} seçeneği
Açıkaması şöyle.
"with names read from standard input" means that xargs takes the data coming in on its standard input, splits it up, and uses it to run the command given in its arguments. By default, it splits on blanks or newlines, and runs echo with as many arguments at a time as possible.
...
The -I option changes the way the new command lines are built. Instead of adding as many arguments as possible at a time, xargs will take one name at a time from its input, look for the given token ({} here) and replace that with the name.
Örnek
Şöyle yaparız.
cat foo | xargs -I{} echo {}
-L seçeneği - max lines
Belirtilen satır sayısı sayı kadar satırı işler.
Örnek
Şöyle yaparız. myfile dosyasında her satırı okur ve myScript'e geçer.
xargs -l1 <myFile myScript
Açıklaması şöyle.
-l1 tells xargs to run myScript once for each 1 line of input, with the words on that 1 line passed as separate arguments.
Örnek
Şöyle yaparız. Her bir dosya için chmod +x komutu çalıştırılıyor.
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
-n seçeneği - max arguments
Örnek
Şöyle yaparız.
$ while date +%H:%S; do sleep 1; done | xargs -n2 echo
16:51 16:52
16:53 16:54
16:55 16:56
16:57 16:58
^C
-o seçeneği - tty kullanabilmeyi sağlar
Açıklaması şöyle. Normalde xargs interactive değildir dolayısıyla tty açmaz.
  -o, --open-tty
          Reopen stdin as /dev/tty in the child process before
          executing the command.  This is useful if you want xargs
          to run an interactive application.
xargs tty açmadığı için şu komut hata verir
$ pgrep gvfs | paste -s -d ',' | xargs -t top -p
top -p 1598,1605,1623,1629,1635,1639,1645,1932,2744
top: failed tty get
Düzeltmek için şöyle yaparız
pgrep gvfs | paste -s -d ',' | xargs --open-tty top -p
-P seçeneği - max processes
Komutları paralel hale getirmek için -n 1 ile komuta tek bir parametre verilmesi sağlarnı

Örnek - Palelleştirme
En fazla 100 process başlatmak için şöyle yaparız
printf '%s\n' file*.txt | xargs -n 1 -P 100 perl dataProcessing.pl
Örnek - Palelleştirme
İşlemci sayısı kadar gzip'i paralel başlatmak için şöyle yaparız.
 -t çalıştırılan komutu konsola yazar. 
-r girdi string boşsa komutu çalıştırmaz.
-0 ile girdiler arasında NULL byte delimiter kullanılır. 
-n ile her komuta en fazla 1 parametre verilir.
-P ile işlemci sayısı kadar komutu başlatılır.
find -type f -not -name '*.gz' -print0 | xargs -tr0n 1 -P$(nproc) gzip
-p prompt seçeneği
Interactive anlamına gelir. Kullanıcıdan y veya Y gelirse komutu çalıştırır.
Örnek
Şöyle yaparız. Sadece y ile cevap verilen dosyalar için chmod komutu çalıştırılır.
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
-t seçeneği
Çalıştırılan komutu konsola yazar

-0 seçeneği - Ayraç olarak null kullanır
xargs normalde dosya isminde ayraç olarak whitespace kullanır. Ancak bazı dosya isimlerinin içinde boşluk olabiliyor. Bu gibi durumlarda Windows'ta dosya ismi tırnak içine alınır. Ancak bir çok program dosya ismini tırnak ile üretemez. Bu durumda xargs'a dosya isimleri için ayraç farklı bir şey kullanmasını söylemek gerekir. Ayraç olarak genellikle null karakteri kullanılır.

Örnek
Şöyle yaparız. find -print0 ile dosya isimleri arasına null koyar. xargs ise ayraç olarak null kullanır. ve 1 MB'den büyük dosyalar silinir.
find . -size +1M -print0 | xargs -r0 rm --
Örnek
Şöyle yaparız. Burada print sonucunda içinde boşluk olan bir çıktı üretiliyor. Bunu ssh komutuna geçiyoruz. ssh ta karşı makinede çalışacak xargs komutuna geçiyor
printf '%s\0' "$DEST_PATH/subdir1" "$DEST_PATH/subdir2" |
  ssh -i key 10.10.10.10 'xargs -0 mkdir -p --'
-r seçeneği
Açıklaması şöyle.
-r tells xargs not to run the command if the input file is empty.
Örnek
Şöyle yaparız. Dosyadaki her satır için gzip -d komutunu çalıştırır.
xargs -rd'\n' gzip -d <large_file_list
-s seçeneği - max characters
Okunacak karakter sayısın belirtir. Şöyle yaparız.
printf '%s ' {1..1024} | strace -e read xargs -s 2048 -x
--showlimists seçeneği
Örnek
Şöyle yaparız. Burada Size of command buffer we are actually using satırı önemli. xargs 128 KiB civarnda bir girdi alabiliyor.
$ xargs --show-limits < /dev/null
Your environment variables take up 3456 bytes
POSIX upper limit on argument length (this system): 2091648
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2088192
Size of command buffer we are actually using: 131072
Maximum parallelism (--max-procs must be no greater): 2147483647